Como você pode mover (ou copiar) todos os arquivos para um diretório com o mesmo prefixo de nome de arquivo?

9

Usando o Bash

Então, digamos que eu tenha um monte de arquivos colocados aleatoriamente em um diretório pai ~/src , eu quero pegar todos os arquivos correspondentes a um determinado sufixo e mova (ou copie) para um diretório ~/dist .

Vamos supor que todos os nomes de arquivos tenham esta convenção de nomenclatura:

<filename_prefix>.<filename_suffix>

Descobri que essa era uma maneira rápida de obter todos os arquivos com um determinado filename_suffix e colocá-los em uma pasta dist:

mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;

Agora, um passo adiante ... como posso usar a saída de find, neste caso filename , e usar o filename_prefix para gerar um diretório com o mesmo nome em ~/dist e depois mover (ou copiar todos os arquivos com esse prefixo no diretório apropriado?

mkdir ~/dst
find source -name "*.xrt,*.ini,*.moo" -exec mv -i {} -t ~/dst \;

Essencialmente, como eu mudo o comando acima (ou talvez use outro comando), para criar uma estrutura como essa

(OUTPUT)

~/dist/people/people.xrt
~/dist/games/games.xrt
~/dist/games/games.moo
~/dist/games/games.ini
~/dist/monkeys/monkeys.ini
~/dist/monkeys/monkeys.xrt

de uma árvore de diretórios como essa?

(INPUT)

~/src/xrt/people.xrt
~/src/xrt/games.xrt
~/src/conf/games.ini
~/src/pack/monkeys.xrt
~/src/e344/games.moo
~/src/e344/monkeys.moo
~/src/en-us/monkeys.ini
    
por qodeninja 06.02.2012 / 21:12

2 respostas

10

Seria um inferno dizer find o que fazer neste caso.

Melhor usar o shell:

for i in **/*.{xrt,ini,moo}; do
  FILE=$(basename "$i")
  DIR=~/dst/${FILE%.*}
  echo mkdir -p -- "$DIR"
  echo mv -i -t "$DIR" -- "$i"
done

Use shopt -s globstar para fazer o ** glob funcionar (ou use zsh!). E remova o echo s mais tarde se o comando imprimir o que você deseja.

    
por 06.02.2012 / 21:35
2

traindo a linha de comando:

find source -name "*.xrt,*.ini,*.moo" -exec env file={} bash -c 'base="$(basename "$file")";dir="dst/${base%.*}";mkdir -p "$dir";cp "$file" "$dir"' \;

na verdade, uma solução para chamar o script bash em encontrar o LOL.

= P

    
por 07.02.2012 / 00:04