отредактировано, чтобы лучше объяснить вопрос.

поэтому я хочу сканировать каталог, искать подкаталоги, содержащие --import-me в конце имени каталога, переходить в новый каталог со всеми содержащимися в нем файлами, просто переименовать каталог без строки --import-me

cd $some-dir
for f in `find . -name "*--import-me" `
do
rename=${f%--import-me}
echo mv $f "some-other-dir"/"$rename"
done

я получил

mv ./iZombie /some-other-dir/./iZombie
mv (2015)--import-me /some-other-dir/(2015)

Я ожидаю, что это даст мне

mv ./some-other-dir/iZombie (2015)

2 ответа2

0

Из вашего примера видно, что каталоги *--import-me существуют только в текущем каталоге, если вы можете использовать этот однострочный:

find . -type d -name "*--import-me" -exec sh -c 'mv $0 some-dir/${0%--import-me}' {} \;

В противном случае, если у вас есть вложенные каталоги, вы должны использовать этот, обратите внимание на то, что если / в целевом каталоге (some-dir), вам придется экранировать их \/:

find . -type d -name "*--import-me" -exec sh -c 'mv $0 `echo $0| sed "s/.*\/\(.*\)--import-me/some-dir\/\1/g"`' {} \;
0

так что я не могу заставить это работать, имя файла всегда разделяется на пробелы, поэтому он пытается создать два отдельных каталога. это выполняется из скрипта, в идеале можно найти каталоги, содержащие "* _import-me", переименовать и переместить одной командой, но сейчас я пытаюсь переместить каталоги (из $ dldDir в $ libDir), содержащие _import-me, затем переименовать dirs в libDir (удалив строку _import-me)

mv "$dldDir"/*_import-me "$libDir"
cd $libDir
find . -type d -name "*_import-me" -exec sh -c 'mv $0 `echo $0| sed "s/.*\/\(.*\)_import-me/"$libDir"\/\1/g"`' {} \;

Итак, первый mv работает, и ls $ dldDir дает мне

~# ls -1 $dldDir
Brother Bear 2 (2006)_import-me
Terminator Salvation (2009)_import-me

но второй mv(удаляя _import-me в $ libDir) я получаю

mv: target ‘(2009)_import-me’ is not a directory
mv: target ‘(2006)_import-me’ is not a directory

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .