编辑以更好地解释问题。
所以我想扫描一个目录,查找目录名末尾包含 --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)
答案1
从您的示例来看,*--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"`' {} \;
答案2
所以我似乎无法让它工作,文件名总是在空格处分割,所以它会尝试 mv 两个单独的目录。这是从一个脚本运行的,理想情况下是找到包含“*_import-me”的目录,在一个命令中重命名和移动,但现在我试图移动包含 _import-me 的目录(从 $dldDir 到 $libDir),然后重命名 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(删除 $libDir 中的 _import-me) 我得到了
mv: target ‘(2009)_import-me’ is not a directory
mv: target ‘(2006)_import-me’ is not a directory