我有一个文档库,其中所有文件都位于基于类别名称的文件夹中,但它们也都位于名为“pdf”的子文件夹中。有没有办法在 bash 中扫描库中的所有目录并将名为 pdf 的文件夹中的所有文件移动到其父目录中?
答案1
下面将pdf
文件夹里的每个文件移动到父目录中。
find ~/some/folder -type d -name 'pdf' -print0 | while IFS= read -d '' dir
do
find "$dir" -type f -maxdepth 1 -exec echo mv -- {} "$dir"/.. \;
done
echo
一旦确定它满足您的需要,就将其删除。
请注意,如果父级文件已包含同名文件,则此操作将不经询问而直接覆盖文件。使用mv -i
此功能可在覆盖任何内容之前提示您确认。
答案2
这是我的想法。它不是最漂亮的东西,但它符合您的要求:
find . -ipath "*pdf/*.pdf" -type f -print0 | xargs -0 -I{} sh -c 'mv "{}" "$(dirname "{}")"/..'
它仅将子文件夹.pdf
中的文件移动pdf
到其相应的父目录中。要更改命令以移动全部子文件夹中的文件pdf
,将ipath
参数调整为*pdf/*
。
示例用法
$ find .
.
./category1
./category1/other_dir
./category1/other_dir/c1o1.txt
./category1/pdf
./category1/pdf/c1p1.pdf
./category1/pdf/c1p2.pdf
./category1/pdf/c1p3.pdf
./category2
./category2/other_dir
./category2/other_dir/c2o1.txt
./category2/pdf
./category2/pdf/c2p1.pdf
./category2/pdf/c2p2.pdf
./category2/pdf/c2p3.pdf
$ find . -ipath "*pdf/*.pdf" -type f -print0 | xargs -0 -I{} sh -c 'mv "{}" "$(dirname "{}")"/..'
.
./category1
./category1/c1p1.pdf
./category1/c1p2.pdf
./category1/c1p3.pdf
./category1/other_dir
./category1/other_dir/c1o1.txt
./category1/pdf
./category2
./category2/c2p1.pdf
./category2/c2p2.pdf
./category2/c2p3.pdf
./category2/other_dir
./category2/other_dir/c2o1.txt
./category2/pdf