为什么使用mv命令无法移除目录?

6次阅读
没有评论

问题描述

尝试使用mv命令将WhatsApp应用程序存储的内容从内部存储移动到外部SD卡时遇到了错误,提示“Is a directory”,即所操作的对象是一个目录。因此,使用mv直接移动包含子目录和文件的整个目录遇到困难。
在讨论区中,有人建议可以考虑通过创建硬链接、使用tar命令进行打包与解压、移除原有目录等方法来解决此问题。

解决方案

1. 使用 cp -altar 方法

如果目标文件系统支持硬链接并且源和目标在同一文件系统中,可以尝试使用以下命令:

cp -al /data/media/0/WhatsApp/* /data/media/0/WhatsApp/.* $sdcard/WhatsApp/

这样会将源目录及其内容(包括子目录)复制到目标位置,并保持硬链接关系。

2. 使用 tar 命令进行打包与解压

如果上述方法不适用,则可以使用一个更为复杂的方法,通过tar命令将整个目录以及隐藏文件和目录打包,再将其解压缩到指定位置。

# 打包原目录
mkdir -p $sdcard/WhatsApp
tar cf - /data/media/0/WhatsApp/* /data/media/0/WhatsApp/.* | tar xfA -C $sdcard/WhatsApp/

这条命令的逻辑是:
1. 创建一个名为$sdcard/WhatsApp的目标文件夹,以存放解压缩后的所有内容。
2. 使用tar cf将原目录及其隐含内容打包并发送到标准输出(stdout);
3. tar xfA -C $sdcard/WhatsApp/ ... 从标准输入读取数据,并将其放置在指定的目录下。

3. 移除原有目录

无论使用哪种方法完成文件转移后,您需要手动删除原目录:

rm -rf /data/media/0/WhatsApp/

此条命令将递归地移除/data/media/0/WhatsApp及其内部的所有内容。

备选方案:单独处理文件和子目录

针对直接使用mv的方法,如果仅需保留隐藏文件、正常文件及部分隐藏子目录,则可以按建议执行:

cp -r /data/media/0/WhatsApp/* $sdcard/WhatsApp/
cp -r /data/media/0/WhatsApp/.* $sdcard/WhatsApp/
rm -rf /data/media/0/WhatsApp/

这条系列命令的作用分别是:
1. 将所有非隐藏文件从原目录移动到目标位置。
2. 手动拷贝指定的隐藏文件(以.开头)至目标位置。
3. 最后彻底删除原始存储目录,确保内部的临时操作已经完成并且不会重复。

注意事项

  • 请务必确认用户所运行的环境对软硬链接、tar命令的支持情况。
  • 对于文件系统的兼容性特别需要注意使用的方法是否能在目标设备上正常工作。
  • 在执行过程中需谨慎,特别是在生产环境中。建议提前备份重要数据以防止意外删除或其他破坏。

通过上述方法之一,您可以处理因含有特殊目录结构而难以用mv直接完成移动任务的情况下遇到的问题。选择最合适的方法取决于您的具体需求、操作系统以及文件系统特性。

正文完