read source
read destination
destination=$(cd -- "$destination" && pwd)
cd -- "$source" &&
find . -name '*.ext1' -o -name '*.ext2' -exec sh -c '
mkdir -p "$0/${1%/*}"
mv "$1" "$0/$1"
' "$destination" {} \;
我有上面的代码找到文件,然后尝试保留目录结构。但问题是它没有找到并移动我所要求的类型的所有文件 - 出了什么问题?它似乎错过了最低目录级别的文件。
Source/
\->File (misses this)
\->Folder/
\->File (finds/moves this)
答案 0 :(得分:5)
-o
的优先级低于相邻表达式之间隐含的-a
,因此
find . -name '*.ext1' -o -name '*.ext2' -exec blah
将被解析为
find . '(' -name '*.ext1' ')' -o '(' -name '*.ext2' -exec blah ')'
。
为了得到你想要的,做:
find . '(' -name '*.ext1' -o -name '*.ext2' ')' -exec sh -c '
mkdir -p "$0/${1%/*}"
mv "$1" "$0/$1"
' "$destination" {} \;