Как переименовать несколько файлов с разными именами в file1, file2, file3 и т. Д.? [dубликат]

У этого вопроса уже есть ответ: Переименуйте все файлы в папку на последовательные номера. 2 ответа

Предположим, у меня есть эти файлы в моей папке:

cat.txt dog.txt house.txt tree.txt

I хотите переименовать все из них примерно так:

file1.txt file2.txt file3.txt file4.txt

Возможно ли это сделать через командную строку?

Я только видел вопросы о переименовании файлов, которые имеют некоторые тип рисунка, например, переименование dog1.txt, dog2.txt -> cat1.txt, cat2.txt.

4
задан 22 July 2017 в 07:39

6 ответов

Для этого используйте утилиту rename:

rename -n '$_ = sprintf "file%d.txt", ++$::count' *

Примечания

-n заставляет команду показать вам, что произойдет, если вы запустите ее. Если результат был тем, что вы хотите, запустите его без -n, чтобы фактически переименовать файлы. замените * на то, что вы хотите переименовать, например: dog*.txt, чтобы переименовать dog1.txt, dog2.txt ... в file1.txt, file2.txt и т. д. $_ - это вход по умолчанию ( имена файлов), которые мы должны изменить. используя =, мы модифицируем его с помощью sprintf, мы определяем схему, начатую file, а затем %d означает число и заканчивается на .txt. номер (% d) будет назначен с помощью ++$::count, который является простым счетчиком, итератором после каждого переименования.

Идея исходит отсюда.

4
ответ дан 22 May 2018 в 20:19
  • 1
    Это сработало! Спасибо. Это был самый простой метод, который я видел. Ну, я не парень разработчика, так что вы могли бы немного объяснить часть - & gt; '$ _ = sprintf " файл% d.txt & quot ;, ++ $ :: count'? Я понимаю, что файлы будут переименованы как file1, file2 и т. Д. Из-за «файла% d.txt», но остальная часть кода, которую я пытаюсь понять. Благодарю. – Denis Alves 21 July 2017 в 22:53
  • 2
    @DenisAlves Обновлен ответ. – Ravexina 21 July 2017 в 23:15
  • 3
    Теперь я понимаю. Спасибо огромное! – Denis Alves 21 July 2017 в 23:25

Для этого используйте утилиту rename:

rename -n '$_ = sprintf "file%d.txt", ++$::count' *

Примечания

-n заставляет команду показать вам, что произойдет, если вы запустите ее. Если результат был тем, что вы хотите, запустите его без -n, чтобы фактически переименовать файлы. замените * на то, что вы хотите переименовать, например: dog*.txt, чтобы переименовать dog1.txt, dog2.txt ... в file1.txt, file2.txt и т. д. $_ - это вход по умолчанию ( имена файлов), которые мы должны изменить. используя =, мы модифицируем его с помощью sprintf, мы определяем схему, начатую file, а затем %d означает число и заканчивается на .txt. номер (% d) будет назначен с помощью ++$::count, который является простым счетчиком, итератором после каждого переименования.

Идея исходит отсюда.

5
ответ дан 18 July 2018 в 09:54

Для этого используйте утилиту rename:

rename -n '$_ = sprintf "file%d.txt", ++$::count' *

Примечания

-n заставляет команду показать вам, что произойдет, если вы запустите ее. Если результат был тем, что вы хотите, запустите его без -n, чтобы фактически переименовать файлы. замените * на то, что вы хотите переименовать, например: dog*.txt, чтобы переименовать dog1.txt, dog2.txt ... в file1.txt, file2.txt и т. д. $_ - это вход по умолчанию ( имена файлов), которые мы должны изменить. используя =, мы модифицируем его с помощью sprintf, мы определяем схему, начатую file, а затем %d означает число и заканчивается на .txt. номер (% d) будет назначен с помощью ++$::count, который является простым счетчиком, итератором после каждого переименования.

Идея исходит отсюда.

5
ответ дан 24 July 2018 в 19:28

Это может быть сделано, но с некоторыми оговорками. Вы заявили, что «... эти файлы [находятся] в моей папке», что было бы одним из таких оговорок. Мы могли бы использовать globstar и перебирать расширенные имена файлов:

$ c=0;for f in *; do ((c++));  echo "$f" "--->" file"$c".txt ; done                            
cat.txt ---> file1.txt
dog.txt ---> file2.txt
house.txt ---> file3.txt
tree.txt ---> file4.txt

Конечно, вы всегда можете пойти «вручную» с помощью list.txt, где вы можете сохранить список имен файлов и прочитать этот файл через while IFS= read -r ; do ... done < list.txt

$ c=0; while IFS= read -r f; do ((c++)); echo "$f" file"$c" ; done < input.txt                 
cat.txt file1
dog.txt file2
tree.txt file3

Конечно, эта тема списка может быть расширена разными способами - csv-списками, json-файлами, списками ключевых значений - вы называете это. В Интернете есть много вопросов. Конечно, есть другие варианты, которые вы должны сделать, например, дать полный путь к файлам или выполнить все в той же директории, что и список.

Наконец, я уже намекнул на списки ключевых значений. С bash и другими более современными языками сценариев, такими как Python или Perl, вы можете иметь хеш (или словарь) со списком файлов и соответствующим новым именем, которое вы хотите, чтобы файл имел.

1
ответ дан 22 May 2018 в 20:19

Это может быть сделано, но с некоторыми оговорками. Вы заявили, что «... эти файлы [находятся] в моей папке», что было бы одним из таких оговорок. Мы могли бы использовать globstar и перебирать расширенные имена файлов:

$ c=0;for f in *; do ((c++)); echo "$f" "--->" file"$c".txt ; done cat.txt ---> file1.txt dog.txt ---> file2.txt house.txt ---> file3.txt tree.txt ---> file4.txt

Конечно, вы всегда можете пойти «вручную» с помощью list.txt, где вы можете сохранить список имен файлов и прочитать этот файл через while IFS= read -r ; do ... done < list.txt

$ c=0; while IFS= read -r f; do ((c++)); echo "$f" file"$c" ; done < input.txt cat.txt file1 dog.txt file2 tree.txt file3

Конечно, эта тема списка может быть расширена разными способами - csv-списками, json-файлами, списками ключевых значений - вы называете это. В Интернете есть много вопросов. Конечно, есть другие варианты, которые вы должны сделать, например, дать полный путь к файлам или выполнить все в той же директории, что и список.

Наконец, я уже намекнул на списки ключевых значений. С bash и другими более современными языками сценариев, такими как Python или Perl, вы можете иметь хеш (или словарь) со списком файлов и соответствующим новым именем, которое вы хотите, чтобы файл имел.

2
ответ дан 18 July 2018 в 09:54

Это может быть сделано, но с некоторыми оговорками. Вы заявили, что «... эти файлы [находятся] в моей папке», что было бы одним из таких оговорок. Мы могли бы использовать globstar и перебирать расширенные имена файлов:

$ c=0;for f in *; do ((c++)); echo "$f" "--->" file"$c".txt ; done cat.txt ---> file1.txt dog.txt ---> file2.txt house.txt ---> file3.txt tree.txt ---> file4.txt

Конечно, вы всегда можете пойти «вручную» с помощью list.txt, где вы можете сохранить список имен файлов и прочитать этот файл через while IFS= read -r ; do ... done < list.txt

$ c=0; while IFS= read -r f; do ((c++)); echo "$f" file"$c" ; done < input.txt cat.txt file1 dog.txt file2 tree.txt file3

Конечно, эта тема списка может быть расширена разными способами - csv-списками, json-файлами, списками ключевых значений - вы называете это. В Интернете есть много вопросов. Конечно, есть другие варианты, которые вы должны сделать, например, дать полный путь к файлам или выполнить все в той же директории, что и список.

Наконец, я уже намекнул на списки ключевых значений. С bash и другими более современными языками сценариев, такими как Python или Perl, вы можете иметь хеш (или словарь) со списком файлов и соответствующим новым именем, которое вы хотите, чтобы файл имел.

2
ответ дан 24 July 2018 в 19:28

Другие вопросы по тегам:

Похожие вопросы: