从以空格分隔的文件名创建文件夹并将文件复制到其中

从以空格分隔的文件名创建文件夹并将文件复制到其中

我目前正在尝试组织数千个文件,这些文件根据其中的内容进行命名,并且各种“标签”(如果您愿意)用空格分隔。因此,例如:

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

笔记:因为您希望该文件存在于原始目录中..使用CP代替MV

相关内容