Crie pastas a partir de nomes de arquivos delimitados por espaços e copie arquivos neles

0

Isso provavelmente parecerá uma pergunta idiota, mas atualmente estou tentando organizar vários milhares de arquivos que são nomeados de acordo com o que há neles, e as várias "tags", se você quiser, são separadas por espaços. Então, por exemplo:

foo_bar bar_foo.txt

Sou relativamente novo no Linux / Unix e queria saber se havia uma maneira de percorrer todos os arquivos, criar pastas com base nas tags e copiar os arquivos para essas pastas?

Então, acabaríamos com:

./foo_bar bar_foo.txt
./foo_bar/foo_bar bar_foo.txt
./bar_foo/foo_bar bar_foo.txt

Até agora, fiz manualmente tudo assim:

mkdir foo_bar
cp *foo_bar* foo_bar/
mkdir bar_foo
cp *bar_foo* bar_foo/
...

Obviamente, isso é bem ineficiente em termos de tempo, por isso estou apenas procurando uma maneira de fazer isso automaticamente.

Edit: Mais alguns exemplos:

Entrada:

./a b c d.txt
./b a d.txt
./c d e.txt
./d a.txt

Saída:

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
    
por Swammy 09.12.2016 / 10:34

1 resposta

0

tente isto .. remova o eco .. se você estiver satisfeito com os comandos ...

ls * | awk '{print $1}' | sort -u | while read a; do echo mkdir -p $a; echo mv ${a}*txt ${a}; done

resposta modificada

$ 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

Observação: como você deseja que o arquivo esteja presente em seu diretório original. use cp em vez de mv

    
por 09.12.2016 / 10:52