Возможно ли переименовать файл с порядковым номером, используя {1..10}?

Возможно ли переименовать файл с порядковым номером, используя {1..10}?

У меня есть сомнения. Мне нужно переименовать файл с порядковым номером от 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

Связанный контент