1

Я хочу добавить «0» к каждому имени файла с одним целым числом в качестве имени файла, т.е.

1.jpg -> 01.jpg

Я использовал следующую команду, но она ничего не сделала.
Можете рассказать о проблеме или что еще сделать?

find . -maxdepth 1 -type d \( ! -name . \) -exec fish -c "cd '{}' ; 
for f in *;
  if [ (string length '$f') -eq '5' ];
    mv '$f' '0$f';
  end;
end; " \;

Похоже, та же команда работает из командной строки, но не при вызове через скрипт. То же самое, когда я пытаюсь вызвать seq (без явно указанного диапазона) из скрипта ... говорит "отсутствует операнд".

2 ответа2

1

Посмотрите, работает ли это для вас:

find . -maxdepth 1 -type f -name "[0-9].???" -printf "mv \"%p\" \"%h/0%f\"\n"

Это найдет все файлы в текущем каталоге, которые состоят из одной цифры и заканчиваются расширением 3 символа. Если вы хотите каталоги вместо файлов (как в вашем примере), замените -type f на -type d . Если вам нужно разрешить более длинные расширения, вы можете настроить шаблон поиска. Если вам нужен рекурсивный поиск, удалите параметр -maxdepth 1 . Результатом этой команды будут команды, которые нужно выполнить для переименования. Например:

$ ls
10.png  1.png  2.png  3.png

$ find . -maxdepth 1 -type f -name "[0-9].???" -printf "mv \"%p\" \"%h/0%f\"\n"
mv "./3.png" "./03.png"
mv "./2.png" "./02.png"
mv "./1.png" "./01.png"

Если вывод выглядит правильно, вы можете запустить его, отправив вывод команды find в вашу оболочку:

$ find . -maxdepth 1 -type f -name "[0-9].???" -printf "mv \"%p\" \"%h/0%f\"\n" | fish

$ ls
01.png  02.png  03.png  10.png
0

Решение fish, которое не включает команду find будет выглядеть так:

#!/usr/bin/env fish
for f in *.jpg
    if string match -qr '^\d\.' -- $f
        mv $f 0$f
    end
end
for f in **/*.jpg
    set p (string split --right --max=1 / -- $f)
    if string match -qr '^\d\.' -- $p[2]
        mv $f $p[1]/0$p[2]
    end
end

Вы можете сделать это с помощью одного цикла for, который получает как файлы jpg в текущем каталоге, так и все его подкаталоги:

for ***.jpg
    do stuff
end

Однако это усложняет логику внутри блока for, поскольку файлы в cwd не будут иметь компонента каталога.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .