chown todos os arquivos baseados no padrão de nome de arquivo no diretório atual

5

Estou tentando colocar todos os arquivos cujos nomes de arquivos começam com ChownFileNames . Eu usei esse comando, mas parece que não funciona:

find . -maxdepth 1 |grep 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;

O que estou fazendo de errado?

    
por van 20.06.2012 / 12:56

4 respostas

7
chown hadoop:hadoop ChownFileNames*
    
por 20.06.2012 / 13:04
5

Isso deve funcionar para o que você precisa:

find . -maxdepth 1 -iname 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;
    
por 20.06.2012 / 14:31
4

O símbolo | ("pipe") significa passar a saída do comando à esquerda para o comando à direita. O comando find . -maxdepth 1 lista os arquivos no diretório atual (mais . em si). O comando grep 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \; não faz sentido: você está passando find options para o comando grep .

find em si tem uma maneira de combinar nomes de arquivos, o predicado -name . É necessário um padrão curinga de shell como argumento.

Você pode usar grep para filtrar a lista, mas precisará fornecer uma linha de comando válida para grep . Para reter apenas os nomes de arquivo que correspondem ao padrão de shell ChownFileNames* , você precisaria usar a expressão regular /ChownFileNames[^/]$ . Em seguida, você teria que analisar a saída de grep para transformar a lista de nomes correspondentes em argumentos de linha de comando. Supondo que você esteja executando o Linux e os nomes de arquivos não contenham novas linhas, você pode usar xargs :

find . -maxdepth 1 |
grep '/ChownFileNames[^/]*$' |
xargs -d '\n' chown hadoop:hadoop

É muito mais simples e mais robusto usar a ação find do -exec . Observe que você pode usar -exec … {} + para executar o comando de um lote de arquivos de uma só vez, em vez de uma vez por arquivo. Você também pode fazer find listar o diretório atual.

find . maxdepth 1 \( -name . -o -name 'ChownFileNames*' \) -exec chown hadoop:hadoop {} +

Normalmente, não há sentido em executar find quando você só está combinando arquivos pelo nome (e não por data) no diretório atual (sem subdiretórios). A menos que haja tantos arquivos no diretório atual que isso torne a linha de comando muito longa, apenas use

chown hadoop:hadoop . ChownFileNames*
    
por 21.06.2012 / 01:28
0

Por favor, dê uma olhada nas opções -name ou -iname em find(1)

    
por 20.06.2012 / 13:06