Сценарий Bash для перемещения файлов в каталоги, указанные в текстовом файле

Направить вывод в команду column -t.

0
02.05.2021, 11:37
3 ответа

Использование perl renameутилиты (, также известной как prenameиfile-rename):

$ rename -n 's/Round(\d)Div(\d)/Round_$1_Div$2/' */*
rename(Round1Div2/file3.txt, Round_1_Div2/file3.txt)
rename(Round1Div2/file4.txt, Round_1_Div2/file4.txt)
rename(Round2Div2/file3.txt, Round_2_Div2/file3.txt)
rename(Round2Div2/file4.txt, Round_2_Div2/file4.txt)

Опция -nделает это пробным -прогоном, так что он только показывает, что он будет делать, а не делает это на самом деле. Когда вы уверены, что он будет делать то, что вы хотите, либо удалите -n(, который просто переименовывает файлы без отображения хода выполнения или другого вывода ), либо замените его на -vдля подробного вывода:

$ rename -v 's/Round(\d)Div(\d)/Round_$1_Div$2/' */*
Round1Div2/file3.txt renamed as Round_1_Div2/file3.txt
Round1Div2/file4.txt renamed as Round_1_Div2/file4.txt
Round2Div2/file3.txt renamed as Round_2_Div2/file3.txt
Round2Div2/file4.txt renamed as Round_2_Div2/file4.txt
0
28.07.2021, 11:35

Проще всего использовать что-то вроде

mv -i Round1Div2/* Round_1_Div2 && rmdir Round1Div2
mv -i Round2Div2/* Round_2_Div2 && rmdir Round2Div2

Если есть конфликты имен, опция -iдля mvдолжна дать вам интерактивную подсказку с вопросом, хотите ли вы перезаписать файл.

Если у вас есть скрытые имена файлов или много тысяч файлов, вы можете использоватьrsync:

rsync -av --ignore-existing Round1Div2/ Round_1_Div2
rsync -av --ignore-existing Round2Div2/ Round_2_Div2

Обратите внимание, что /в конце имени исходного каталога добавлено намеренно. Это воссоздаст файловую иерархию исходных каталогов в целевых каталогах и не перезапишет существующие данные. Исходные каталоги останутся на месте (, так что это копирует , а не перемещает, если только вы не добавите опцию--remove-source-files).

0
28.07.2021, 11:35

Я бы использовалmv -S dup folder1/* folder2

Вы можете использовать mvв интерактивном режиме с -i, как предлагает другой ответ . Или вы можете использовать-S--suffix=SUFFIX . Это означает, что если файл file.txt уже существует, то этот файл в новом месте будет переименован в file.txtdup (с -S dup ).

Использованиеawk:

Поскольку у вас есть каталоги, перечисленные в текстовых файлах. Для этой цели можно использовать следующую команду awk:

awk '{ printf "mv -S dup %s/* ", $0 ; getline < "newname.txt"; printf "%s\n", $0 }' rename.txt

0
28.07.2021, 11:35

Теги

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