Ubuntu - 如何复制包含特殊字符的文件和文件夹

Ubuntu - 如何复制包含特殊字符的文件和文件夹

我有一个以只读方式挂载的文件系统,其中有许多带有特殊字符(如&(和 )的文件"。我想使用 将所有文件和文件夹递归复制到外部 exFat 卷,cp -R但当我尝试时,出现许多错误,如下所示:

cp: cannot create regular file ‘/media/How About Better Parents?.pdf’: No such file or directory

有没有办法复制这些包含有效但特殊字符的文件名?

答案1

您可以分步执行此操作,创建文件列表并为每个文件命名。您可能必须先创建目标目录。如果目录结构相对扁平,您可以使用 手动执行此操作mkdir -p path。如果有许多目录,但它们不包含空格或非法目标字符,您可以使用(例如从 /dvd 到 /media)

cd /media ; ( cd /dvd ; find . -type d ) | xargs mkdir -p

这会将您置于目标目录中(为 做好准备mkdir),然后列出源目录下的所有目录,并将它们发送到。如果您需要目录名称中的空格,mkdir您可以将findoption-print0xargsoption一起使用。-0

然后使用find创建要复制的文件列表,例如

cd /dvd ; find . -type f | sed 's/\(.*\)/cp "\1" "\1"/' > /tmp/copy.sh

然后编辑文件/tmp/copy.sh,替换目标名称中的所有非法字符。对于每个文件名,sed命令在其前面插入cp,然后将文件名放在双引号内(源),然后将文件名放在双引号内(目标)。一旦您觉得这个看起来可以接受,就制作copy.sh可执行文件并运行它。

免责声明:与往常一样,可能会将文件复制到错误的位置、填满文件系统等,因此在运行大量命令之前,请手动尝试几个命令并检查结果。您可以先xargs mkdir尝试查看命令会做什么,以测试命令xargs echo mkdir

答案2

您必须使用 exFAT 以外的文件系统。根据维基百科文章,文件名中允许使用的字符包括:

Unicode UTF-16 除外

  • U+0000 (NUL) 至 U+001F (US)
  • /(削减)
  • \(反斜杠)
  • :(冒号)
  • *(星号)
  • ?(问号)
  • "(引用)
  • <(少于)
  • >(比...更棒)
  • |(管道)

相关内容