toque em todas as pastas de um diretório

13

Estou tentando atualizar os registros de data e hora de todas as pastas no cwd usando:

for file in 'ls'; do touch $file; done

Mas parece que não funciona. Alguma idéia por quê?

    
por javamonkey79 08.10.2011 / 02:11

4 respostas

21

Todas as respostas até agora (assim como seu exemplo na pergunta) assumem que você deseja touch all no diretório, mesmo que tenha dito "tocar todas as pastas". Se o diretório contiver arquivos e pastas e você quiser apenas atualizar as pastas, use find :

$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +

Ou se a implementação de find não der suporte aos predicados não padrão de -mindepth / -maxdepth :

$ find . ! -name . -prune -type d -exec touch {} +

Isto:

$ touch -c -- */

Deve funcionar na maioria dos shells, exceto que:

  • também serão touch links simbólicos para diretórios além de diretórios simples
  • omitirá os ocultos
  • se não houver diretório ou link simbólico para o diretório, ele criaria um arquivo chamado * em shells diferentes de csh , tcsh , zsh , fish ou o shell Thompson (que relataria um erro em vez de). Aqui, estamos usando -c para contornar isso, embora isso ainda possa ser touch de um arquivo não-diretório chamado * .

Apenas com zsh , para touch diretórios, incluindo os ocultos:

touch -- *(D/)
    
por 08.10.2011 / 03:11
11

Tente

touch ./*

Evita o loop for desnecessário que cria um novo processo para cada arquivo e funciona para todos os nomes de arquivos, mesmo aqueles com espaços ou itens que se parecem com opções (como -t ). A única vez que isso não funcionaria é se você não tiver arquivos (não pontuais) no diretório, caso em que você acabaria criando um arquivo chamado * . Para evitar isso, para o caso específico de touch , a maioria das implementações tem uma opção -c (também chamada --no-create nas versões GNU) para não criar arquivos inexistentes, ou seja,

touch -c ./*

Veja também as boas referências na resposta de jasonwryan assim como este um .

    
por 08.10.2011 / 02:42
7

Você não deve tentar analisar a saída de ls .

Além disso, você deve citar seu "$file" para capturar qualquer espaço em branco. Consulte o link

Algo como isso pode alcançar o que você procura:

for file in *; do touch "$file"; done

Veja os dois primeiros Bash Pitfalls para uma explicação mais completa.

    
por 08.10.2011 / 02:20
-1
for file in 'find .'; do touch $file; done
    
por 30.08.2016 / 17:40

Tags