У меня есть эта папка, которая содержит много папок, каждая из которых содержит много файлов со структурой имен .XYZ.zip.
Я хотел бы переименовать их (используя bash) в XYZ.zip (т.е. убрать их).
Я видел вопрос , пытавшийся сделать аналогичную вещь,
alias deannoy='for annoyingbak in *.bak;do mv "$annoyingbak" ."$annoyingbak";done'>> ~/.bashrc && . .bashrc
, но мне не удалось изменить, так что это делается рекурсивно для всех папок вниз из текущей папки.
Вы можете использовать эту команду:
$ find foobar/ -type f -iname ".*" -exec rename -n 's/^(.+)\/\.(.+)$/$1\/$2/' '{}' \;
foobar/sub_dir/moresubdir/.foo bar.zip renamed as foobar/sub_dir/moresubdir/foo bar.zip
foobar/sub_dir/moresubdir/.one.zip renamed as foobar/sub_dir/moresubdir/one.zip
foobar/sub_dir/moresubdir/.two.zip renamed as foobar/sub_dir/moresubdir/two.zip
foobar/sub_dir/.one.zip renamed as foobar/sub_dir/one.zip
foobar/sub_dir/.two.zip renamed as foobar/sub_dir/two.zip
foobar/.foo bar.zip renamed as foobar/foo bar.zip
foobar/.one.zip renamed as foobar/one.zip
foobar/.two.zip renamed as foobar/two.zip
find
будет рекурсивно искать все скрытые файлы, а затем передавать их в rename
. Параметр -n
приводит к тому, что переименование запускает правило замены, чтобы показать, во что эти файлы будут переименованы. Если вы довольны результатами, удалите параметр, чтобы он переименовал файлы в реальный режим
Команда for ... in *.bak
ищет только текущий каталог.
Вместо этого вы хотите использовать команду find
, которая выполняет рекурсивный поиск. Эта команда найдет все zip-файлы, начиная с точки на любой глубине в текущем каталоге (.
).
find . -iname '.*.zip'
Хотя удаление ведущей точки немного сложнее. Следующее, кажется, работает (но может иметь крайние случаи, предостережение emptor).
for f in $(find -iname '.*.zip'); do f2=$(echo $f | sed -re 's/(.*)\/\.(.*)/\1\/\2/'); echo $f $f2; done
Это напечатает все операции, которые он будет выполнять (echo $f $f2
), если этот список выглядит правильно, измените его на mv $f $f2
и он будет переименовывать.
Хороший ответ на сестринском сайте stackoverflow : он говорит:
#!/bin/bash recurse() { for i in "$1"/*;do if [ -d "$i" ];then echo "dir: $i" recurse "$i" elif [ -f "$i" ]; then echo "file: $i" fi done } recurse /path
ИЛИ, если у вас bash 4.0
blockquote >#!/bin/bash shopt -s globstar for file in /path/** do echo $file done
Скажи спасибо на stackexchange на ghostdog74, если это работает для тебя. Там также будет работать учетная запись Askubuntu.