
У меня есть сомнения. Мне нужно переименовать файл с порядковым номером от 1 до 10. Я могу создать файл со следующими параметрами.
touch file.$(date +%Y).$$.{1..10}
Но я не могу переименовать файл с помощью следующей команды. Почему {1..10} не принимает. Потому что я хочу переименовать файл как. Команда mv примет {1..10} ?
file.201704.<PID>.1
file.201704.<PID>.2
.
.
.
.
так что приведенная ниже команда верна?
for file in $(ls);
do
mv $file file.$(date +%Y%m).$$.{1..10}
done
решение1
Расширение фигурных скобок {1..10}
приведет к расширению командной строки за счет включения нескольких аргументов.
Например, touch
командная строка будет расширена до чего-то вроде
touch file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10
перед выполнением. Это нормально, так как touch
утилита принимает любое количество аргументов в командной строке. Примечание: это создает 10 файлов, а не один.
Однако mv
утилита имеет иную семантику по сравнению с touch
. Она ожидает один или несколько исходных файлов/каталогов и один целевой файл/каталог в конце.
Это означает, что когда
mv $file $file.$(date +%Y%m).$$.{1..10}
расширяется до чего-то вроде
mv file file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10
предполагается, что вы хотите переехатьвсефайлы, за исключением последнего в командной строке. Кроме того, он ожидает, что последнее в командной строке будет именем каталога (так как вы перемещаете несколько вещей).
Мне неясно, что вы на самом деле хотите сделать в этом цикле, поэтому я не могу подробнее прокомментировать, как решить эту проблему.
Что касается самого цикла,пожалуйстаникогда не используйте вывод ls
типа этого. Вместо этого сделайте
for file in ./*; do
# process "$file"
done
Вывод ls
для васпосмотри на, он не подходит для использования в сценарии по нескольким причинам. Смотретьhttp://unix.stackexchange.com/questions/128985/why-not-parse-ls
Также всегда заключайте переменные в двойные кавычки. См.http://unix.stackexchange.com/questions/171346/вопросы-безопасности-забывания-цитаты-переменной-в-оболочках-bash-posix