Не переименовывать дочерний каталог при переименовании родительского каталога

Не переименовывать дочерний каталог при переименовании родительского каталога

Мое дерево каталогов выглядит следующим образом:

/media/blueray/Data/Test$ tree
.
├── What????
│   └── What????
└── What????.txt

Когда я запускаю командуfind . -depth | rename 's/[?<>\\:*|\"]//g'

Там написано -

Can't rename ./What????/What???? ./What/What: No such file or directory

Однако после выполнения команды структура каталогов становится такой:

/media/blueray/Data/Test$ tree
.
├── What
│   └── What????
└── What.txt

Мне кажется, что он findначинает поиск с вершины дерева и поэтому теряет его из виду.

Каково же здесь решение?

решение1

Проблема вызвана не find, а тем rename, что он обрабатывает полный путь, поэтому пытается переименовать ./What????/What????в ./What/What, что не удается, поскольку Whatкаталог не существует (пока).

Если начать renameобрабатывать только имена файлов с помощью -d, это исправит ситуацию:

find . -depth | rename -d 's/[?<>\\:*|\"]//g'

Если ваша версия renameне поддерживает эту -dопцию (появилась в версии 1.10 File::Rename, если у вас renameверсия Perl), вы можете findпередать только имена файлов, выполнив renameвнутри каждого каталога:

find . -depth -execdir rename 's/[?<>\\:*|\"]//g' {} +

(БлагодаряФреддидлярешение.)

Связанный контент