Como anexar uma data a todos os arquivos em um diretório sem tocar em subdiretórios via script bash

4

Atualmente estou fazendo uma aula de Sistemas Operacionais e estamos aprendendo a fazer scripts de bash como parte do currículo. Eu preciso acrescentar a data a todos os arquivos em um diretório sem tocar em subdiretórios por meio de um script. Eu estive para remendar um script de uma linha que irá anexar a data a todos os arquivos, mas também atinge as pastas no diretório atual.

for f in *; do mv -- "$f" "$f-$(stat -c %Y "$f" | date +%Y%m%d)"; done

Isso adicionará a data ao final do nome do arquivo, mas, como eu disse, ela atinge os diretórios abaixo dela. Atualmente estou usando a versão 4.1.2 do bash no RedHatLinux.

Estou confuso como todos saem por causa de como eu sou inexperiente com o Unix (sou principalmente um usuário do Windows), portanto, qualquer ajuda seria apreciada.

    
por coraldayton 30.11.2014 / 04:07

3 respostas

4

Como o slm já indicou, você pode testar se $f é um arquivo normal. Enquanto aprendi, eu mudaria o script para não ser um forro, eles tendem a ser mais difíceis de ler e manter:

for f in *
do 
  if [ -f "$f" ]
  then
    mv -- "$f" "$f-$(stat -c %Y "$f" | date +%Y%m%d)"
  fi 
done

(você sempre pode dobrar isso mais tarde inserindo ; e excluindo novas linhas)

O -f testa o argumento para ser um arquivo regular (não um dispositivo ou diretório), existem outros testes também ( -d para o diretório, por exemplo, então você pode testar if [ ! -d "$f" ] também neste caso) .

    
por 30.11.2014 / 07:25
2

Isso deve funcionar para o que você precisa;

for file in $(find . -type f); do mv -- "$file" "$file-$(stat -c %Y "$file" | date +%Y%m%d)"; done

Para explicar a nova parte, você está usando o comando find para encontrar apenas arquivos (tipo -f);

find . -type f .

    
por 30.11.2014 / 07:21
1

Você não precisa de um loop, apenas use find junto com exec option + sh -c :

find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(stat -c %Y "$0" | date +%Y%m%d)' {} \;

No entanto, canalizar stat para date não faz muito sentido para mim. Se você quiser acrescentar atual data a todos os nomes de arquivos, então stat não é necessário:

find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(date +%Y%m%d)' {} \;

Por outro lado, se você deseja acrescentar tempo da última modificação de cada arquivo, use a opção -r do date :

find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(date -r "$0" +%Y%m%d)' {} \;

E, se desejar, apenas para exercício, use a saída de stat como uma entrada da date e, em seguida, use a opção --date do comando date :

find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(date +%Y%m%d --date=@$(stat -c %Y "$0"))' {} \;
    
por 30.11.2014 / 12:53