如何删除目录但不删除其中的文件?我尝试了以下方法:
rm -di /Users/arthur/Desktop/MyFolder
remove /Users/arthur/Desktop/MyFolder? y
rm: /Users/arthur/Desktop/MyFolder: Directory not empty
我在用 Mac。顺便说一句,我想自动执行此操作。
答案1
方法 1 – 先移动,然后删除
只需将文件上移一个目录,然后将其删除即可。这将保留所包含的文件/文件夹层次结构。
mv ~/Desktop/MyFolder/* ~/Desktop/MyFolder/..
rmdir ~/Desktop/MyFolder
方法 2 – 在 Shell 函数中自动化
您可以将其放入您定义的 shell 函数中~/.bash_profile
:
function rmd () {
if [ -d "$1" ]; then
mv "$1"/* "$1"/..
rmdir "$1"
else
echo "$1 is not a directory"
fi
}
如前所述,这只会删除父文件夹,而保持子层次结构完好无损。
方法 3 – 递归删除
如果您想要递归删除所有文件夹并仅保留其中包含的文件,请改用以下命令:
function rmdr () {
if [ -d "$1" ]; then
p="$1"/..
find "$1" -type f -exec mv '{}' "$p" \;
rm -rf "$1"
else
echo "$1 is not a directory"
fi
}
请注意,这将覆盖具有重复名称的文件。
方法 4 - 具有重复感知的递归删除
最后,如果您想保留重复文件,可以检查它们是否已经存在。在这种情况下,我们将在它们前面添加一个随机数字符串。当然,可能还有比这更复杂的方法,但您可以看到这是怎么回事。
function rmdr () {
if [ -d "$1" ]; then
p="$1"/..
# loop through all files
while IFS= read -r -d '' file; do
filename=$(basename "$file")
# if it already exists, prefix with random number
if [ -f "$p/$filename" ]; then
mv "$file" "$p/$RANDOM-$filename"
# if it doesn't exist, just move
else
mv "$file" "$p"
fi
done < <(find "$1" -type f -print0)
# remove parent directory
rm -rf "$1"
else
echo "$1 is not a directory"
fi
}
循环find
输出是这里解释。