2016-02-11 2 views
0

SEE VISUAL ПОЯСНЕНИЯ и EDITBash SH Script - Переименовать файл с определенным расширением + Переместить в определенное место

Я пытаюсь создать Баш скрипт, чтобы сделать переименование + ход.

Это пример ситуации:

  |DOCTEMP - NameOfTheFolder---------|NameOfADocument.docx 
FOLDER---| 
     |DOCFINAL - OtherNameOfTheFolder---|OtherNameOfADocument.pdf 
     | 
     |etc. 

То, что я хочу сделать, это скрипт, который:

Часть I

только если файл docx, pdf, ppt переименовать его как его папка, но без DOCTEMP -/DOCFINAL -.

NameOfADocument.docx => NameOfTheFolder.docx 

OtherNameOfADocument.pdf => OtherNameOfTheFolder.pdf 

Часть II

После переименования, переместите файл в другую папку, в зависимости от первой части названия старой папки.

NameOfTheFolder.docx => if **DOCTEMP** then => /ROOT/DOCTEMP/NameOfTheFolder.docx 

OtherNameOfTheFolder.docx => if **DOCFINAL** then => /ROOT/DOCFINAL/OtherNameOfTheFolder.pdf 

Я пытался использовать что-то вроде этого, но он не работает

#!/bin/bash 

cd "$ROOT/FOLDER" 
# for filename in *; do 
find . -type f | while IFS= read filename; do # Look for files in all ~/FOLDER sub-dirs 
    case "${filename,,*}" in # this syntax emits the value in lowercase: ${var,,*} (bash version 4) 
    *.part) : ;; # Excludes *.part files from being moved 
    move.sh) : ;; 
    *test*)   mv "$filename" "$ROOT/DOCTEMP/" ;; # Using move there is no need to {&& rm "$filename"} 
    *) echo "Don't know where to put $filename" ;; 
    esac 
done 

EDIT: Визуальное объяснение

данного

ROOT/DOWNLOADS/OFFICE - House/file.docx 
       /IWORK - Car/otherfile.docx 

затем Часть I

ROOT/DOWNLOADS/OFFICE - House/House.docx 
       /IWORK - Car/Car.docx 

затем Часть II

ROOT/DOCUMENTS/OFFICE/House.docx 
       /IWORK/Car.docx 

DOCX может быть PDF или PPT; здесь только пример

EDIT2: Окончательный сценарий

#!/bin/bash 
shopt -s nullglob 
for filename in /ROOT/DOWNLOADS/{OFFICE,IWORK}/*/*.{docx,pdf,ppt}; do 
    new_path="$(dirname $filename).${filename##*.}" 
    new_path="${new_path/DOWNLOADS/DOCUMENTS}" 
    echo "moving $filename -> $new_path" 
    mv "$filename" "$new_path" 
done 
+0

Вы не должны изменить название вашего вопроса однажды он решил, просто принять правильный ответ;) –

+0

Не редактировать «решаемые» в названиях здесь, ** или ** редактировать ответы на вопросы. Установите флажок, чтобы принять ответ, который он решит, и дает понять читателям, которые вы используете. –

+0

... если вы используете что-то отличное от предложенных сторонних ответов, добавьте это как ответ самостоятельно, не редактируйте его в вопрос. –

ответ

1

я, возможно, пропустили некоторые моменты в этом объяснении. Но будет ли это делать то, что вы хотите?

#!/bin/bash 
shopt -s nullglob 
for filename in /ROOT/DOWNLOADS/{OFFICE,IWORK}/*/*.{docx,pdf,ppt}; do 
    new_path="$(dirname $filename).${filename##*.}" 
    new_path="${new_path/DOWNLOADS/DOCUMENTS}" 
    echo "moving $filename -> $new_path" 
    mv "$filename" "$new_path" 
done 
+0

Спасибо, я тестирую его сейчас. Какой смысл не ясно? Я могу попытаться объяснить это лучше. – DylanDog

+0

Непонятно, что написанный вами сценарий содержит ссылки на вещи, которые не упоминаются в тексте. Например, 'test' и' part'. PS: Я немного изменил шаблон glob в своем ответе, чтобы соответствовать файлам только в подпапках DOCTEMP или DOCFINAL. –

+0

«Тест» - это всего лишь примерное слово как «NameOfTheDocument». «часть» связана с тем, что иногда эти PDF-файлы застегиваются (несколько .part). EDIT: И если вместо DOCTEMP и DOCFINAL я хочу использовать совершенно разные слова, например, OFFICE и IWORK? – DylanDog