chown hadoop:hadoop ChownFileNames*
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?
Isso deve funcionar para o que você precisa:
find . -maxdepth 1 -iname 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;
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 favor, dê uma olhada nas opções -name ou -iname em find(1)