Estou tentando atualizar os carimbos de data e hora de todas as pastas no cwd usando este:
for file in `ls`; do touch $file; done
Mas isso não parece funcionar. Alguma idéia do porquê?
Estou tentando atualizar os carimbos de data e hora de todas as pastas no cwd usando este:
for file in `ls`; do touch $file; done
Mas isso não parece funcionar. Alguma idéia do porquê?
Respostas:
Todas as respostas até agora (assim como o seu exemplo na pergunta) pressupõem que você queira touchtudo no diretório, mesmo que tenha dito "toque em todas as pastas". Se o diretório contiver arquivos e pastas e você desejar apenas atualizar as pastas, poderá usar find:
$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +
Ou se sua findimplementação não suportar os predicados -mindepth/ não padronizados -maxdepth:
$ find . ! -name . -prune -type d -exec touch {} +
Este:
$ touch -c -- */
Deve funcionar na maioria das conchas, exceto que:
touch links simbólicos para diretórios , além de diretórios simples*em outras do que conchas csh, tcsh, zsh, fishou o shell Thompson (que iria relatar um erro em vez disso). Aqui, estamos usando -cpara contornar isso, embora ainda possa ser touchchamado um arquivo que não seja de diretório *.Com zsh, touchapenas para diretórios, incluindo os ocultos:
touch -- *(D/)
{} \+é especial find- leia a página de manual para obter mais informações. Eu acho touch -c ./*/que também funcionaria.
-maxdepth 1no comando, para que findnão seja recursivo em subpastas. O OP parece querer tocar apenas nas pastas no cwd, não nas subpastas.
Experimentar
touch ./*
Evita o forloop desnecessário que geraria um novo processo para cada arquivo e funciona para todos os nomes de arquivos, mesmo aqueles com espaços ou com opções parecidas (como -t). O único momento em que isso não funcionaria é se você não tiver arquivos (sem pontos) no diretório e, nesse caso, acabaria criando um arquivo chamado *. Para evitar isso, no caso específico da touchmaioria das implementações, há uma -copção (também chamada --no-createnas versões GNU) de não criar arquivos inexistentes, ou seja,
touch -c ./*
Veja também as boas referências em resposta de jasonwryan assim como este um .
Você não deve tentar analisar a saída dels .
Além disso, você deve citar seu "$file"para capturar qualquer espaço em branco. Consulte http://www.grymoire.com/Unix/Quote.html
Algo assim pode alcançar o que você procura:
for file in *; do touch "$file"; done
Veja as duas primeiras Bash Pitfalls para uma explicação mais completa.
*não captura arquivos e diretórios cujo nome começa com um ponto. Uma maneira de corrigir isso é ativar a dotglobopção de shell via shopt -s dotglob.