2016-10-07 3 views
0

Я попытался найти похожие вопросы, но не могу найти ничего такого, если бы извинялся, если это или подобное было задано раньше.OSX Bash: динамически переименовывать файлы из списка

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

Текстовый файл будет выглядеть следующим образом (с разделителями табуляции и с заголовком):

"File Name (without Extension)" "Media Number" 
"AK7A7964" "01017134" 
"IMG_0026" "01017192" 
"106491 Anenome" "01017206" 
"CW1_9449" "01017243" 

Я использую это, чтобы очистить файл \ т и «:

cat $file | sed "1 d" | tr "\\t" "," | sed 's/\"//g' > $cleanfile 

Тогда чтение cleanfile в цикл while:

INPUT=$cleanfile 
OLDIFS=$IFS 
IFS=, 
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; } 
while read fname media; do 

И создание нового названия, которое должно быть изменено до начала работы fi lename

newFileName="MA_${media}_" 

Я тогда делать находку для каждого файла с таким именем, используя:

for found in $(find . -type f -name "$fname.*"); do 

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

У меня, вероятно, отсутствует трюк при использовании sed, но я не могу найти руководство, которое не уходит в глубоком конце довольно быстро!

[редактировать добавить]

То, что я делал после того, как последний do был таков: Получение путь и базовое имя, создавая новое имя файла, а затем с помощью mv, чтобы заменить его. Я был на самом деле просто делаю echo так это неразрушающий

foundPath="${found%/*}" 
foundFile="${found##*/}" 

newFile=$newFileName$foundFile 
newFilePath="${foundPath}/${newFile}" 
mv $found $newFilePath 

Если более чем одно вхождение любого файла (как будет), это было только mv «ИНГ последней.

+0

было бы полезно, если бы вы включили то, что вы делаете после того, как 'do' в ваших петель. –

+0

Цикл не будет работать, если в нем есть пробел, например '106491 Anenome'. – Barmar

+0

Как ваш цикл 'while read' использует', 'как разделитель между' fname' и 'media'? – Barmar

ответ

0

Решение я нашел это:

find . -type f -name "${fname}.*" -exec sh -c 'for i; do name=${i##*/} path=${i%/*}; mv "$i" "$path/MA_${media}_$name"; done' _ {} +

Смежные вопросы