Переименование всех файлов в каталоге в числовой последовательности в зависимости от времени создания

В первом случае:

  1. права доступа предотвращают расширение оболочки (*)/var/solr/data/new_core/_default/*, когда вы centos.

  2. Команда
  3. расширяется, а затем как /var/solr/data/new_core/_default/*в первом случае.

  4. в /var/solr/data/new_core/_default/нет *файла или каталога, поэтому no match found.

Во втором случае ls находит файлы и перечисляет их.

(*)это Filename Expansionиз расширения zsh (см.man zshexpn).

FILENAME GENERATION

If a word contains an unquoted instance of one of the characters `*',...

The word is replaced with a list of sorted filenames that match the pattern.

как и вы centosдо sudozsh не может получить доступ к каталогу (, например. файл conf), отсюда и no match found.

0
28.01.2020, 05:42
3 ответа

Использование оболочки zsh:

counter=0

for name in $HOME/folder/*(.NDOm); do
    counter=$(( counter + 1 ))

    suffix=$name:e
    printf -v newname '%s/object%.3d%s' $name:h $counter ${suffix:+.$suffix}

    mv $name $newname
done

Это перебирает все имена обычных файлов в каталоге ~/folder, от самых старых до самых новых по отметке времени последнего -изменения. Для каждого имени создается новое имя с использованием части каталога текущего имени и счетчика. Файлы переименовываются в эти новые имена (без подтверждения и без проверки на конфликты имен ).

Вызов printf -v newname"выводит" свой вывод в переменную newname. Строка формата %.3dвыводит заполненное нулем целое число -в трех позициях (, например. 001, 023, 109и т. д. )Расширение параметра $name:hбудет расширяться до части заголовка/каталога пути $name(это то же самое, что иdirname "$name").

$name:eбудет расширяться до «расширения» исходного имени файла (, например. foo, если текущий файл — apple.foo), и мы сохраняем его в suffix. С помощью ${suffix:+.$suffix}мы добавляем точку к расширению имени файла, если оно есть.

.в (.NDOm)в конце шаблона подстановки имени файла является квалификатором подстановки, который заставляет предыдущий шаблон подстановки соответствовать только обычным файлам. Nи Dзаставляют шаблон действовать так, как если бы nullglobи dotglobв оболочке bashбыли установлены (расширяться до нуля, если совпадений нет, и включать скрытые имена в результат ). Omупорядочивает совпадающие имена таким образом, чтобы самый старый (наименее измененный )файл сортировался первым.

Если zshне является вашей оболочкой входа в систему, то ее можно запустить как сценарий.

$ zsh./this-script
2
28.04.2021, 23:25

Предполагая, что имена файлов не содержат пробелов, табуляции или новой строки, использование одного вкладыша -и bashи awkбыло бы простым:

ls -rt | awk -F "." '{print  $0 " object" sprintf("%03d",NR)  "." $NF }' | xargs -L 1 mv

Команда xargs -lвыполняет mvдля каждой строки. Перед выполнением команды выполните следующую команду и проверьте правильность имен целевого и исходного файлов:

ls -rt | awk -F "." '{print  $0 " object" sprintf("%03d",NR)  "." $NF }'

должен вывести что-то вроде:

melon.foo object001.foo
cookie.foo object002.foo
pie.foo object003.foo
apple.foo object004.foo
0
28.04.2021, 23:25

Вот версия, написанная на bashс утилитами GNU, которая не требует синтаксического анализа lsи будет обрабатывать любые файлы с юридическими именами (, встроенные пробелы, знаки препинания, новые строки и т. д.)

#!/bin/bash
k=0                                               # start at the beginning
find *.foo -type f -printf "%T@ %p\0" |           # list all the files with modification time
    sort -z |                                     # sort by increasing modification time
    cut -z -d' ' -f2- |                           # discard the time value leaving just the name
    while IFS= read -r -d '' file                 # now loop for each file...
    do
        ((++k))                                   # next count
        seq=$(printf "%03d" $k)                   # format the three-digit counter
        name="${file%.*}" ext="${file##*.}"       # split filename into name and extension
        echo will mv "$file" "$name.$seq.$ext"    # show what would happen without doing it
    done

Удалите echo will, когда будете готовы к выполнению команды mv.

Пример

# preparation
for f in {melon,cookie,pie,apple}.foo; do touch "$f"; sleep 1; done

# list in order of modification time (oldest to newest)
ls -tr
melon.foo  cookie.foo  pie.foo  apple.foo

# run the script and observe the output
k=0; find *.foo -type f -printf "%T@ %p\0" | sort -z | cut -z -d' ' -f2- | while IFS= read -r -d '' file; do ((++k)); seq=$(printf "%03d" $k); name="${file%.*}" ext="${file##*.}"; echo mv "$file" "$name.$seq.$ext"; done

will mv melon.foo melon.001.foo
will mv cookie.foo cookie.002.foo
will mv pie.foo pie.003.foo
will mv apple.foo apple.004.foo
1
28.04.2021, 23:25

Теги

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