move arquivos correspondentes a um padrão específico

1

Como posso mover arquivos em uma pasta com um padrão específico para a pasta de destino?

Eu quero mover arquivos com nomes no intervalo [00-09] na quarta coluna quando separados pelo delimitador "-".

ls | cut -d "-" -f 4 | grep ^[00-09]

Mostra estes arquivos:

UNCID_376947.TCGA-DD-A118-01A-11R-A131-07.110525_UNC12-SN629_0087_BC03HWABXX.7.trimmed.txt
UNCID_377115.TCGA-CC-5263-01A-01R-A131-07.110525_UNC12-SN629_0087_BC03HWABXX.5.trimmed.txt
UNCID_377252.TCGA-DD-A114-11A-12R-A131-07.110525_UNC12-SN629_0087_BC03HWABXX.6.trimmed.txt
    
por r.bot 20.10.2015 / 11:53

2 respostas

7

Use uma expressão glob:

mv your_dir/*?-*?-*?-0[0-9]* new_dir/

Para testá-lo, você pode primeiro executar um ls your_dir/*?-*?-*?-0[0-9]* para garantir que corresponda aos arquivos desejados.

A expressão *?-*?-*?-0[0-9]* significa: caracteres + - três vezes e, em seguida, 0 e qualquer caractere.

Teste

$ ls
another_dir/  aa-03A-b  aa-b-03A-b  aa-b-c-03A-b  a-b-c-03A-b  a-b-c-23A-b
$ mv *?-*?-*?-0[0-9]* another_dir/
$ ls another_dir/
aa-b-c-03A-b  a-b-c-03A-b
    
por fedorqui 20.10.2015 / 11:57
2

Você pode usar um 'loop for':

for FILE in 'file-list'
do
  echo "$FILE"
  mv "$FILE" /your/destination/
done

Explicação:

'file-list' deve ser substituído por um método para obter uma lista dos arquivos que você deseja usar. Por exemplo, $(cat files.txt) se você já tiver uma lista em um arquivo, pattern* se os arquivos em seu diretório começarem com o mesmo padrão ou $(find -iname "*pattern*" ) se você quiser usar find para obter a lista. A saída será armazenada na variável FILE um elemento após o outro. Os comandos entre do e done são executados para cada elemento. Você pode usar echo "$FILE" para verificar se o comando corresponde aos arquivos corretos antes de adicionar o comando mv ao loop.

    
por Wayne_Yux 20.10.2015 / 12:08