Как я могу добавить числа к файлам в одном каталоге?
В одном каталоге у меня есть файлы как ниже:
fileA
fileB
fileC
fileD
Я хочу предварительно ожидать возрастающие числа им, как это:
1_fileA
2_fileB
3_fileC
4_fileD
Заранее спасибо.
Одно из решений:
cd <your dir>
затем выполненный в ударе (копия и вставка в командной строке):
n=1; for f in *; do mv "$f" "$((n++))_$f"; done
Случай сценария Bash:
#!/bin/bash
n=1
for f in *
do
if [ "$f" = "rename.sh" ]
then
continue
fi
mv "$f" "$((n++))_$f"
done
сохраните его как rename.sh
к dir с файлами для переименования, chmod +x rename.sh
затем выполните его ./rename.sh
Откройте свой каталог в Наутилусе.
Выделите все файлы.
Щелкните правой кнопкой, и выбор "Переименовывает..." из контекстного меню.
На Переименовать диалоговом окне нажмите +Add кнопку.
Выберите "1,2,3,4" под "автоматическими числами"
Затем в Переименовать диалоговом окне, в поле ввода текста, вставляют подчеркивание "_" символ между" [1, 2, 3]" и" [Исходное имя файла]".
Это должно быть похожим" [1, 2, 3] _ [Исходное имя файла]"
Нажмите кнопку Rename.
Если бы существует больше чем 9 файлов, я использовал бы printf
заполнять число для получения ожидаемого порядка сортировки, как это
n=0
for f in *
do printf -v new "%2d$((++n))_$f"
echo mv -v -- "$f" "$new"
done
Удалить echo
когда Вы видите корректный результат.
В этой строке, do printf -v new "%2d$((++n))_$f"
мы создаем формат для новых имен файлов и помещаем его в переменную new
.
%2d
2 десятичных числа цифры. Вместо 2d
, можно использовать 3d
и т.д. для получения другого продвижения 0 (если у Вас есть больше чем 99 файлов).
((++n))
увеличивает переменную n
(который мы устанавливаем на 0 в начале сценария). Так как это выполнено с помощью итераций однажды каждый раз, когда цикл выполняется, файлы получают увеличенные префиксы имени.
-v
делает mv
печать, что будет изменено.
--
в mv
оператор должен предотвратить имена файлов, которые запускаются с -
быть интерпретируемым как опции.
Это - задание для file-rename
(иначе жемчуг переименовывает):
file-rename -n 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *
Это определяет переменную, увеличения это, если бы это не установило (еще, это запустилось бы с 0
вместо 1
) и заменяет начало имени файла с числом, увеличивающим его каждый раз. Можно изменить формат легко, например, сделать это трехразрядным (001
, 002
, …) использование "%03d_"
. Выполнение его с -n
только печатает изменения, для фактического выполнения переименования удаляют этот флаг.
Используя систему альтернатив, rename
связан с file-rename
в моей системе.
$ ls -1
fileA
fileB
fileC
fileD
$ rename -n 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *
rename(fileA, 1_fileA)
rename(fileB, 2_fileB)
rename(fileC, 3_fileC)
rename(fileD, 4_fileD)
$ rename 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *
$ ls -1
1_fileA
2_fileB
3_fileC
4_fileD
Одна опция
cd /path/to/folder/
ls -1v | rename -n -v 's/^/sprintf("%02d_", ++our$i)/e'
Это хорошо работает, кроме с именами файлов с новой строкой "\n". Переключите заботу о '-1v'takes о пробелах и вкладках,
Другие команды, отправленные здесь, изменяют порядок файлов с числами, например, 10a прибывает прежде 1a.
Какой бы ни подходит в ситуации.
У меня было некоторое время для тестирования всех этих команд. Вот результаты.
$ ls
001abc.txt '10a bc.txt' 1abc.txt '2ab c.txt' 'a'$'\t''bc.txt'
$ ls -1v | rename -n -v 's/^/sprintf("%02d_", ++our$i)/e'
Reading filenames from file handle (GLOB(0x55cb57991b28))
rename(001abc.txt, 01_001abc.txt)
rename(1abc.txt, 02_1abc.txt)
rename(2ab c.txt, 03_2ab c.txt)
rename(10a bc.txt, 04_10a bc.txt)
rename(a bc.txt, 05_a bc.txt)
$ n=1; for f in *; do echo mv "$f" "$((n++))_$f"; done
mv 001abc.txt 1_001abc.txt
mv 10a bc.txt 2_10a bc.txt
mv 1abc.txt 3_1abc.txt
mv 2ab c.txt 4_2ab c.txt
mv a bc.txt 5_a bc.txt
$ for f in *; do printf -v new "%2d$((++n))_$f"; echo mv -v -- "$f" "$new"; done
mv -v -- 001abc.txt 09_001abc.txt
mv -v -- 10a bc.txt 010_10a bc.txt
mv -v -- 1abc.txt 011_1abc.txt
mv -v -- 2ab c.txt 012_2ab c.txt
mv -v -- a bc.txt 013_a bc.txt
$ ./rename.sh
mv 001abc.txt 1_001abc.txt
mv 10a bc.txt 2_10a bc.txt
mv 1abc.txt 3_1abc.txt
mv 2ab c.txt 4_2ab c.txt
mv a bc.txt 5_a bc.txt
$ rename -n 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *
rename(001abc.txt, 1_001abc.txt)
rename(10a bc.txt, 2_10a bc.txt)
rename(1abc.txt, 3_1abc.txt)
rename(2ab c.txt, 4_2ab c.txt)
rename(a bc.txt, 5_a bc.txt)
rename(rename.sh, 6_rename.sh)
$ for f in *; do printf -v new "%2d$((++n))_$f"; echo mv -v -- "$f" "$new"; done
mv -v -- 001abc.txt 01_001abc.txt
mv -v -- 10a bc.txt 02_10a bc.txt
mv -v -- 1abc.txt 03_1abc.txt
mv -v -- 2ab c.txt 04_2ab c.txt
mv -v -- a bc.txt 05_a bc.txt
mv -v -- rename.sh 06_rename.sh
pyrenamer является также очень легким решением