공백으로 구분된 파일 이름으로 폴더를 만들고 여기에 파일을 복사합니다.

공백으로 구분된 파일 이름으로 폴더를 만들고 여기에 파일을 복사합니다.

저는 현재 내용에 따라 이름이 지정되고 공백으로 구분된 다양한 "태그"가 있는 수천 개의 파일을 정리하려고 합니다. 예를 들면 다음과 같습니다.

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

관련 정보