从 Windows 中分离具有大写和小写文件名的文件夹和文件

从 Windows 中分离具有大写和小写文件名的文件夹和文件

我在Windows系统中有大写和小写文件名的文件文件夹。

对于以“a”或“A”开头的文件名,存储在文件夹“A”或“a”中。所有以“b”或“B”开头的文件名都存储在文件夹“B”或“b”中。 ETC

当前文件夹名称可以是随机的大写“A”或小写“a”。

现在,我的任务是将这些文件夹和文件移动到Linux中,并根据大小写目录名和文件名将文件分成不同的文件夹。 (例如,atF0Gxx 文件放在“a”文件夹下,而 A0p9xxx 文件放在“A”文件夹下,b、B、c、C、d、D...z、Z 也类似)

如果不对每个文件和文件夹手动执行操作,有什么解决方案吗?

混合有大写和小写文件名的文件

答案1

zsh

autoload -Uz zmv
mkdir -p {a..z} {A..Z}
zmv '[a-zA-Z]/(([a-zA-Z])*)' '$2/$1'

mv -- x/Xwhatever X/Xwhatever将为每个文件运行,跳过mv对已位于正确目录中的文件的调用。添加一个-n选项以zmv仅查看它将做什么而不实际执行它。

答案2

不如 优雅zmv,但一个简单的for-loop 就足够了:

#!/bin/bash
for letter in {a..z} {A..Z} ; do
  mkdir /path/to/dest/$letter
  mv /path/to/source/*/${letter}?* /path/to/dest/$letter
done

答案3

一个稍微高效的版本,仅遍历实际存在的字母和数字:

for file in *; do
    if [[ ! -d "$file" ]]; then
        firstLetter=${file:0:1}
        mkdir -p "$firstLetter"
        mv -- "$file" "$firstLetter"/
    fi
done 

但是,如果您有文件与目录之一同名。例如,名为 的文件a不允许您创建也名为 的目录a。为了解决这个问题,你可以这样做:

tmpDir=$(mktemp -p "." -d)
for file in *; do
    if [[ ! -d "$file" ]]; then
      firstLetter=${file:0:1};
      ## If a file exists with this name
      if [[ -e "$firstLetter" && ! -d "$firstLetter" ]]; then
        ## move the file to the tmp dir and update the value
        ## of the $file variable to point to it
        mv -- "$file" "$tmpDir"
        file="$tmpDir/$file"
      fi
      mkdir -p "$firstLetter";
      mv -- "$file" "$firstLetter"/;
    fi
done
# $tmpDir should be empty by now
rmdir "$tmpDir"

相关内容