2014-01-02 2 views
0

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

for file in $(find $1 -name '*.xyz') 
do 
    echo "Modifying $file"; 

    ***CHANGE file here. For example $file = file1.xyz. move this to "file1_140102.xyz"*** 

done 

ответ

1
for file in *.txt 
do 
    echo "Modifying $file" 

    name=`echo "$file" | cut -d'.' -f1` 
    ext=`echo "$file" | cut -d'.' -f2` 
    mv $file "$name"_`date +%Y%m%d`".$ext" 
done 
+0

'touch' не переименует файл для вас. – ProfessionalAmateur

+0

Да, думал, я бы только подтолкнул. –

1

Не используйте подстановки команд внутри для цикла по причинам, изложенным здесь: http://mywiki.wooledge.org/ParsingLs. Используйте цикл while istead.

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

find "$1" -type f -name '*.xyz' -print0 | while IFS= read -r -d '' filename; do 
    extension="${filename##*.}" 
    no_ext="${filename%.*}" 
    mv "$filename" "${no_ext}_$(date +%y%m%d).${extension}"  
done 
+0

Возможно, используя дату? 'mv" $ filename "" $ {no_ext} _ $ (date +% y% m% d). $ {extension} "' – onionjake

+0

@onionjake Right. Я не понимал, что 140102 - текущая дата назад :) – user000001

+0

Возможно, было бы лучше «сделать <<(найти ...)», чтобы все это не работало в подоболочке? Также вы должны добавить команду '' '' 'в команду mv. –

1

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

DATE=`date "+%y%m%d"` 

    for file in $(find "$1" -name '*.xyz'); 
    do 

     echo "Modifying $file"; 
     BASE=`basename $file .xyz`; 
     mv ./$file ./$BASE_$DATE.xyz; 
    done 
+0

, который хорошо работает, за исключением того, что я теряю путь в имени и пишу файл на верхнем уровне. Какая команда дает мне путь к файлу? – user3155129

+0

@ user3155129 Вы можете использовать команду 'dirname' для этого – user000001

+0

В строке mv попробуйте следующее: mv ./$file ./$BASE_$DATE.xyz; – Abend

1

Если вы используете bash 4 или более поздней версии, здесь не нужно find; вы можете использовать опцию globstar.

for f in "$1"/**/*.xyz; do 
    mv "$f" "${f%.xyz}_$(date +%y%m%d).xyz" 
done 

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

"$(date +${f%.xyz}_%y%m%d.xyz)" 

Формат даты действительно произвольная строка, в которой процент-ускользает расширены, так что вы может иметь «дату» в качестве имени файла.

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