スペースで区切られたファイル名でフォルダを作成し、ここにファイルをコピーします。

スペースで区切られたファイル名でフォルダを作成し、ここにファイルをコピーします。

私は現在の内容に基づいて名前が付けられ、スペースで区切られたさまざまな「タグ」を持つ何千ものファイルを整理しようとしています。たとえば、次のようになります。

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

関連情報