Скрипт для отображения файлов с определенным расширением в папках рекурсивно

У меня есть эта папка, которая содержит много папок, каждая из которых содержит много файлов со структурой имен .XYZ.zip.

Я хотел бы переименовать их (используя bash) в XYZ.zip (т.е. убрать их).

Я видел вопрос , пытавшийся сделать аналогичную вещь,

alias deannoy='for annoyingbak in *.bak;do mv "$annoyingbak" ."$annoyingbak";done'>> ~/.bashrc && . .bashrc

, но мне не удалось изменить, так что это делается рекурсивно для всех папок вниз из текущей папки.

1
задан 13 April 2017 в 15:23

3 ответа

Вы можете использовать эту команду:

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

0
ответ дан 13 April 2017 в 15:23

Команда 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 и он будет переименовывать.

0
ответ дан 13 April 2017 в 15:23

Хороший ответ на сестринском сайте 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

#!/bin/bash
shopt -s globstar
for file in /path/**
do
    echo $file
done

Скажи спасибо на stackexchange на ghostdog74, если это работает для тебя. Там также будет работать учетная запись Askubuntu.

0
ответ дан 13 April 2017 в 15:23

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

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