![如果目录包含特定字符串,则移动目录和文件(从目录名称中删除字符串)](https://linux22.com/image/1472990/%E5%A6%82%E6%9E%9C%E7%9B%AE%E5%BD%95%E5%8C%85%E5%90%AB%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%8C%E5%88%99%E7%A7%BB%E5%8A%A8%E7%9B%AE%E5%BD%95%E5%92%8C%E6%96%87%E4%BB%B6%EF%BC%88%E4%BB%8E%E7%9B%AE%E5%BD%95%E5%90%8D%E7%A7%B0%E4%B8%AD%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%89.png)
编辑以更好地解释问题。
所以我想扫描一个目录,查找目录名末尾包含 --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