私は現在の内容に基づいて名前が付けられ、スペースで区切られたさまざまな「タグ」を持つ何千ものファイルを整理しようとしています。たとえば、次のようになります。
foo_bar bar_foo.txt
私はLinux/Unixに初めて触れ、各ファイルを繰り返し、タグに基づいてフォルダを作成し、そのフォルダにファイルをコピーする方法があるかどうか疑問に思います。
だから私たちは次のように終わります:
./foo_bar bar_foo.txt
./foo_bar/foo_bar bar_foo.txt
./bar_foo/foo_bar bar_foo.txt
これまで、私は以下を手動で行ってきました。
mkdir foo_bar
cp *foo_bar* foo_bar/
mkdir bar_foo
cp *bar_foo* bar_foo/
...
明らかにこれは膨大な時間の無駄なので、自動化する方法を探しています。
編集:追加例:
入力する:
./a b c d.txt
./b a d.txt
./c d e.txt
./d a.txt
出力:
All original files still in parent directory, plus:
./a/a b c d.txt
./a/b a d.txt
./a/d a.txt
./b/a b c d.txt
./b/b a d.txt
./c/a b c d.txt
./c/c d e.txt
./d/a b c d.txt
./d/b a d.txt
./d/c d e.txt
./d/d a.txt
./e/c d e.txt
答え1
これを試してください。エコーを削除してください。
ls * | awk '{print $1}' | sort -u | while read a; do echo mkdir -p $a; echo mv ${a}*txt ${a}; done
修正された回答
$ ls
a b c d.txt b a d.txt c d e.txt d a.txt
$ ls * | sed "s/.txt//;s/ /\n/g" | sort -u | while read file; do echo mkdir -p $file; echo mv *${file}*.txt ${file}; done
mkdir -p a
mv a b c d.txt b a d.txt d a.txt a
mkdir -p b
mv a b c d.txt b a d.txt b
mkdir -p c
mv a b c d.txt c d e.txt c
mkdir -p d
mv a b c d.txt b a d.txt c d e.txt d a.txt d
mkdir -p e
mv c d e.txt e
メモ:ファイルが元のディレクトリに存在したいので、..useCP変えるMV