mais antigo para o arquivo mais novo na árvore de diretórios e excluir cada arquivo interativamente

0

Na etapa 1, estou tentando encontrar o arquivo mais antigo na árvore de diretórios, o que resolvi seguindo esta pergunta .

Agora, quero usar xargs para excluir interativamente do mais antigo para o mais novo.

Como esse find -type f -printf '%T+ %p\n' | sort | xargs -0 -d '\n' rm -i não funciona. Eu vi em outro post find . -type f -print0 | xargs -0 ls -rt mas adicionando xargs a ele não funciona, infelizmente.

pi@raspberrypi:/usr/share/doc/samba$ find . -type f -print0 | xargs -0 ls -rt | xargs -0  -d '\n' rm -i
    rm: remove write-protected regular file ‘./examples/LDAP/samba.schema.oc.IBM-DS’? rm: remove write-protected regular file ‘./examples/LDAP/samba-schema-netscapeds5.x.README’? rm: remove write-protected regular file ‘./examples/LDAP/samba-schema.IBMSecureWay’? rm: remove write-protected regular file ‘./examples/LDAP/samba.schema.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba-schema-FDS.ldif.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba.schema.at.IBM-DS.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba-nds.schema.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba.ldif.gz’? rm: remove write-protected regular file ‘./examples/LDAP/ol-schema-migrate.pl.gz’? rm: remove write-protected regular file ‘./examples/LDAP/get_next_oid’? rm: remove write-protected regular file ‘./README.Debian’? rm: remove write-protected regular file ‘./TODO.Debian’? rm: remove write-protected regular file ‘./NEWS.Debian.gz’? rm: remove write-protected regular file ‘./copyright’? rm: remove write-protected regular file ‘./changelog.Debian.gz’? rm: remove write-protected regular file ‘./examples/LDAP/README’?

Por favor, note que este não é um problema de permissão. Eu usei /usr/share/doc/samba como um exemplo para evitar postar meus nomes de arquivos reais.

Pesquisando na web, não encontrei nenhum script que fosse recursivo (árvore inteira), manipulando caracteres em branco e também interativos. Então eu fiz isso. Isso não iria lidar com todos os tipos de caracteres especiais. Então, qualquer melhoria seria aceita.

#!/bin/bash
find -type f -printf '%T+ %p\n' | sort | head -n 3 > /tmp/1
cut -c32- /tmp/1 | awk '{print "rm -i", "\""$_"\""}'/tmp/2
bash /tmp/2
    
por Schultz Hartmut 12.03.2017 / 10:07

2 respostas

0

Os únicos caracteres-problema que vejo no seu script são o " e a nova linha. Você não deve se preocupar muito com a nova linha em um nome de arquivo.

Você pode querer usar nomes de arquivos temporários diferentes, por exemplo, com $$ no nome do arquivo.

Então, como melhoria:

#!/bin/bash
TMP1=/tmp/file1.$$
TMP2=/tmp/file2.$$
find -type f -printf '%T+ %p\n' | sort | head -n 3 > $TMP1
cat $TMP1 | sed 's/"/\"/g;s/[^ ]* //;s/^/rm -i "/;s/$/\"/' >$TMP2
bash $TMP2
rm -f $TMP1 $TMP2

Isso deve lidar com as aspas no seu nome de arquivo. (nota: ainda há alguns problemas com o script. É bom fazer isso em seu próprio ambiente doméstico. E o TMP em maiúsculas não é recomendado, mas eu faço isso de qualquer maneira.)

Nota: xargs -p não funciona quando você tem nomes de arquivos com espaços.

    
por 12.03.2017 / 16:21
0

Você estava quase lá.

Isso faz o que você deseja e manipula espaços em branco em nomes de arquivos:

find -type f -printf '%T+ %p\n' | sort | cut -c32- | xargs -p -n1 -d '\n' rm

-p, --interactive : Avisar o usuário sobre se deve executar cada linha de comando e ler uma linha do terminal. Só execute a linha de comando se a resposta começar com y ou Y.

-n max-args, --max-args=max-args : use no máximo argumentos max-args por linha de comando.

-d delim Os itens de entrada são terminados pelo caractere especificado.

    
por 12.03.2017 / 16:11