在 ReadyNAS Duo v1 上将文件按字母顺序排列的 Bash 脚本

Bar*_*vet 5 scripting bash files

我有一个旧的 ReadyNAS Duo v1 (Sparc),运行着一种未知的 Linux。

我有一个包含 1,000 多个文件的文件夹结构,我想根据文件名的第一个字母(不区分大小写)移动到一个文件夹结构中。

理想情况下,我希望文件结构如下所示:

myfiles-+
        +-A
          + Apple.txt
          + avocado.txt
        +-B
          + Banana.txt
          + broccoli.txt
etc. etc.
Run Code Online (Sandbox Code Playgroud)

我有一个谷歌,但只找到了 GUI 工具。

这可以通过命令行或脚本完成吗?

slm*_*slm 9

这里有一点可以做你想做的单班轮:

$ mkdir -p output/{A..Z}; for i in tstdir/*; do export FILE=$(basename "$i");  LTR=$(echo" ${FILE:0:1}" | tr [a-z] [A-Z]); mv "$i" "output/$LTR/$FILE" ; done
Run Code Online (Sandbox Code Playgroud)

这是展开形式的相同命令,因此您可以看到发生了什么:

$ mkdir -p output/{A..Z}
$ for i in tstdir/*; do 
    FILE=$(basename "$i")  
    LTR=$(echo "${FILE:0:1}" | tr [a-z] [A-Z])
    mv "$i" "output/$LTR/$FILE"
  done
Run Code Online (Sandbox Code Playgroud)

细节

以上首先假设仅字母的输出目录不存在,因此将创建它,

$ mkdir -p output/{A..Z}
Run Code Online (Sandbox Code Playgroud)

for环路的工作原理如下,通过所有文件循环tstdir/*。然后确定basename此路径的 ,并将其存储在变量 中$FILE。循环中的每次迭代都存储在变量中$i

FILE=$(basename "$i")
Run Code Online (Sandbox Code Playgroud)

然后我们使用 Bashes 功能返回命名变量的第一个字符,$FILE,然后使用tr将任何小写字符转换为大写字符。

LTR=$(echo "${FILE:0:1}" | tr [a-z] [A-Z])
Run Code Online (Sandbox Code Playgroud)

再分解一下:

$ echo "${FILE:0:1}"
s
$ echo "${FILE:0:1}"
T
Run Code Online (Sandbox Code Playgroud)

使用tr代码,您现在可以看到发生了什么:

$ echo "${FILE:0:1}" | tr [a-z] [A-Z]
S
$ echo "${FILE:0:1}" | tr [a-z] [A-Z]
T
Run Code Online (Sandbox Code Playgroud)

该命令的其余部分只是将文件移动到相应的首字母目录中。

例子

假设我们有这个文件目录:

$ touch {a-z}file {A-Z}file

$ tree tstdir/ | head -10
tstdir/
|-- afile
|-- Afile
|-- bfile
|-- Bfile
|-- cfile
|-- Cfile
|-- dfile
|-- Dfile
|-- efile
...
Run Code Online (Sandbox Code Playgroud)

运行一个班轮后:

$ tree output/ | head -10
output/
|-- A
|   |-- afile
|   `-- Afile
|-- B
|   |-- bfile
|   `-- Bfile
|-- C
|   |-- cfile
|   `-- Cfile
...
Run Code Online (Sandbox Code Playgroud)