Как я могу предварительно ожидать имена файлов с возрастающими числами как 1_ 2 _?

Как я могу добавить числа к файлам в одном каталоге?

В одном каталоге у меня есть файлы как ниже:

fileA
fileB
fileC
fileD

Я хочу предварительно ожидать возрастающие числа им, как это:

1_fileA
2_fileB
3_fileC
4_fileD

Заранее спасибо.

6
задан 23 November 2018 в 11:54

6 ответов

Одно из решений:

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

8
ответ дан 23 November 2019 в 07:15
  1. Откройте свой каталог в Наутилусе.

  2. Выделите все файлы.

  3. Щелкните правой кнопкой, и выбор "Переименовывает..." из контекстного меню.

  4. На Переименовать диалоговом окне нажмите +Add кнопку.

  5. Выберите "1,2,3,4" под "автоматическими числами"

  6. Затем в Переименовать диалоговом окне, в поле ввода текста, вставляют подчеркивание "_" символ между" [1, 2, 3]" и" [Исходное имя файла]".

    Это должно быть похожим" [1, 2, 3] _ [Исходное имя файла]"

  7. Нажмите кнопку Rename.

Select "1,2,3,4" in the Rename dialog

The renamed files

6
ответ дан 23 November 2019 в 07:15

Если бы существует больше чем 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 оператор должен предотвратить имена файлов, которые запускаются с - быть интерпретируемым как опции.

7
ответ дан 23 November 2019 в 07:15

Это - задание для file-rename Install 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
6
ответ дан 23 November 2019 в 07:15

Одна опция

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
1
ответ дан 23 November 2019 в 07:15

pyrenamer является также очень легким решением

-2
ответ дан 23 November 2019 в 07:15

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

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