
Мое дерево каталогов выглядит следующим образом:
/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' {} +