如果目录包含特定字符串,则移动目录和文件(从目录名称中删除字符串)

如果目录包含特定字符串,则移动目录和文件(从目录名称中删除字符串)

编辑以更好地解释问题。

所以我想扫描一个目录,查找目录名末尾包含 --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

相关内容