我发现 Bruno 的这个脚本可以扁平化目录。有人可以告诉我如何修改它以将其作为循环运行,以便它可以在指定(更高级别)目录中的所有目录上工作吗?
先感谢您 ;)
# This scripts flattens the file directory
# Run this script with a folder as parameter:
# $ path/to/script path/to/folder
#!/bin/bash
rmEmptyDirs(){
local DIR="$1"
for dir in "$DIR"/*/
do
[ -d "${dir}" ] || continue # if not a directory, skip
dir=${dir%*/}
if [ "$(ls -A "$dir")" ]; then
rmEmptyDirs "$dir"
else
rmdir "$dir"
fi
done }
flattenDir(){
local DIR="$1"
find "$DIR" -mindepth 2 -type f -exec mv -i '{}' "$DIR" ';' }
flattenDir "$1" rmEmptyDirs "$1" echo "Done"
答案1
只需一行即可将所有文件(在子子目录中)移动到 pwd。
$ find . -mindepth 2 -type f -exec mv {} .. \;
这将移动所有常规文件,包括点文件(以点开头),但不移动链接。
然后,删除空目录:
$ find . -type d -empty -delete
遗漏的内容包含未移动的链接(或其他类型的文件)。
如果您想要脚本,请使用:
#!/bin/bash
fullpath=${1:-.}
( cd "$fullpath";
find . -mindepth 2 -type f -exec mv {} .. \;
find . -type d -empty -delete
)
将脚本调用为:script /the/path/you.want
答案2
对给定目录中找到的所有目录执行特定操作的一种方法是
setopt -s nullglob
for e in SPECIFIED_DIRECTORY/*
do
setopt -u nullglob
[[ -d $e ]] && YOUR_SCRIPT "$e"
done
请注意,这将跳过名称以点开头的目录。这通常是我们想要的,但如果您也想包含这些目录,您也可以根据这种情况调整我的解决方案:请参阅dotglob
手册页中的选项,并且不要忘记排除特殊目录.
和..
.
另一种可能性是使用类似的东西
find SPECIFIED_DIRECTORY -maxdepth 1 -type d -exec YOUR_SCRIPT {} \;