我已经解压了在 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