У этого вопроса уже есть ответ здесь:
Я хочу скопировать все файлы *. pdf
в * _ 0.pdf
Как я могу это сделать?
В оболочке sh rename
поможет вам:
rename .pdf _0.pdf *.pdf
Выполнить команду в каталоге с файлами PDF.
Если у вас есть файлы внутри каталогов и вы хотите найти все из них и заменить:
find . -iname "*.pdf" | fgrep -v _0.pdf | xargs -n1 echo rename .pdf _0.pdf
Вы хотите переименовать или скопировать файлы? Для обоих можно просто использовать для цикла и mv
(перемещение, также переименовывает), или cp
(копия):
for i in *.pdf; do mv "$i" "${i/%.pdf/_0.pdf}"; done
или скорее
for i in *.pdf; do cp "$i" "${i/%.pdf/_0.pdf}"; done
кавычки только необходимы, если (один из) Ваши файлы содержат пробелы.
Быстрое объяснение: ${i/%.pdf/_0.pdf}
берет переменную i
и заменяет “.pdf” “_0.pdf”, если это найдено в конце строки (следовательно %
). Читайте больше об удивительных супердержавах удара здесь .
Вы хотите переименовать или скопировать?
Для переименования можно использовать emacs:
M-x wdired-change-to-wdired-mode
M-x query-replace
для замены '.pdf' '_0.pdf' C-x C-s
для сохранения буфера Простой путь состоял бы в том, чтобы использовать команда mmv:
mmv '*.pdf' '#1_0.pdf'
<час> Вы, возможно, должны были бы установить его сначала (доступный в репозитории Вселенной):
sudo apt-get install mmv
С rename
(prename
):
rename -n 's/\.pdf$/_0$&/' *.pdf
\.pdf$
соответствия .pdf
в конце имени файла_0
: _0$&
-n
для фактического действияС bash
расширение параметра:
for f in *.pdf; do pre="${f%.pdf}"; echo mv -- "$f" "${pre}_0.pdf"; done
pre="${f%.pdf}"
сохраняет часть имени файла прежде .pdf
как переменная pre
в то время как mv
- луг _0.pdf
добавляется к $pre
: ${pre}_0.pdf
отбрасывание echo
для фактического действия
Пример:
% rename -n 's/\.pdf$/_0$&/' *.pdf
rename(egg.pdf, egg_0.pdf)
rename(spam.pdf, spam_0.pdf)
% for f in *.pdf; do pre="${f%.pdf}"; echo mv -- "$f" "${pre}_0.pdf"; done
mv -- egg.pdf egg_0.pdf
mv -- spam.pdf spam_0.pdf