我可以使用什么命令序列来删除目录但不删除其中的文件?

我可以使用什么命令序列来删除目录但不删除其中的文件?

如何删除目录但不删除其中的文件?我尝试了以下方法:

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输出是这里解释

相关内容