未知の種類のLinuxを実行している古いReadyNASDuov1(Sparc)があります。
1,000以上のファイルを含むフォルダー構造があり、ファイル名の最初の文字に基づいてフォルダー構造に移動します(大文字と小文字は区別されません)。
理想的には、ファイル構造を次のようにしたいと思います:
myfiles-+
+-A
+ Apple.txt
+ avocado.txt
+-B
+ Banana.txt
+ broccoli.txt
etc. etc.
私はGoogleを持っていましたが、GUIツールしか見つかりませんでした。
これは、コマンドラインまたはスクリプトを介して実行できますか?
承認された回答:
これがあなたが望むことをするワンライナーのビットです:
$ 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
何が起こっているかを確認できるように、展開された形式の同じコマンドを次に示します。
$ 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
詳細h3>
上記は最初に、文字だけの出力ディレクトリが存在しないことを前提としているため、それを作成します。
$ mkdir -p output/{A..Z}
for
ループは次のように機能し、tstdir/*
内のすべてのファイルをループします 。次に、basename
を決定します このパスの名前を変数$FILE
に格納します 。ループの各反復は、変数$i
に格納されます。 。
FILE=$(basename "$i")
次に、Bashes機能を使用して、名前付き変数$FILE
の最初の文字を返します。 、次にtr
を使用します 小文字を大文字に変換します。
LTR=$(echo "${FILE:0:1}" | tr [a-z] [A-Z])
これをもう少し詳しく説明します:
$ echo "${FILE:0:1}"
s
$ echo "${FILE:0:1}"
T
tr
を使用 何が起こっているかを確認できるコード:
$ echo "${FILE:0:1}" | tr [a-z] [A-Z]
S
$ echo "${FILE:0:1}" | tr [a-z] [A-Z]
T
コマンドの残りの部分は、ファイルを対応する最初の文字のディレクトリに移動するだけです。
例
次のファイルディレクトリがあるとします:
$ touch {a-z}file {A-Z}file
$ tree tstdir/ | head -10
tstdir/
|-- afile
|-- Afile
|-- bfile
|-- Bfile
|-- cfile
|-- Cfile
|-- dfile
|-- Dfile
|-- efile
...
ワンライナーを実行した後:
$ tree output/ | head -10
output/
|-- A
| |-- afile
| `-- Afile
|-- B
| |-- bfile
| `-- Bfile
|-- C
| |-- cfile
| `-- Cfile
...