从文件“folder\file”创建正确的文件夹结构

从文件“folder\file”创建正确的文件夹结构

我已经解压了在 Windows 中生成的 .zip 文件。

现在我有一个文件列表,例如:

fileonrootfolder.txt
otherfileonrootfolder.txt
folder1\
folder1\filex.xyz
folder1\filey.xyz
folder1\filez.xyz
folder2\filex.xyz
folder2\filey.abc
....

这里的反斜杠 \ 是文件名的一部分。这些文件都存储在同一个根文件夹中。(众所周知,Linux 使用斜杠而不是反斜杠作为文件夹分隔符)

请提供一个 bash 命令来生成正确的文件夹结构并相应地移动文件。(文件夹层次结构仅由一个级别组成)。

谢谢。

附加信息:

$ lsb_release -a 
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 23.10
Release:    23.10
Codename:   mantic
$ uname -a
Linux abc 6.5.0-13-generic #13-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov  3 12:16:05 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

答案1

我不太明白这是怎么发生的,但如果你真的有包含文字反斜杠的文件名,这应该将它们转换为预期的目录结构:

for file in *\\*; do 
  newName=${file/\\/\/}
  if [[ "$file" =~ \\$ ]]; then 
    mkdir -p "$newName" && 
      rm "$file"
  else 
    mkdir -p "$(dirname "$newName")"
    mv -- "$file" "$newName"
  fi
done

解释

  • for file in *\\*:glob*\\*匹配当前目录中名称包含 的任何文件或目录名称\。由于\也是转义字符,因此我们需要对其进行转义,以便将其视为文字。这就是为什么我们不能只使用*\*

    然后,这将遍历名称包含 的所有文件和目录\,并将它们每个保存为$file

  • newName=${file/\\/\/}:这将打印当前文件名,并将 全部\替换为。需要/转义\\和),因为和都是特殊字符。\/\/

  • if [[ "$file" =~ \\$ ]]; then:如果此文件结束带有\,因此如果它应该是一个目录。

  • mkdir -p "$newName" && rm "$file":创建目录,并删除文件。

  • else mkdir -p "$(dirname "$newName")":如果不是目录,则创建父目录

  • mv -- "$file" "$newName":并将文件移入其中。

答案2

根据@FedKad 的提示,我可以使用以下解决方案:https://unix.stackexchange.com/questions/377986/looking-for-a-script-to-convert-a-filename-with-backslashes-into-a-directory-str

for file in *\\*; do 
    dir="$(dirname -- "${file//\\/\/}")"
    filename="${file##*\\}"
    mkdir -p -- "$dir"
    mv -- "$file" "$dir"/"$filename"
done

相关内容