IFS=$(echo -en "\n\b")
Desde que você está assumindo um shell com echo -e
, e você tem bash na sua linha shebang de qualquer maneira, você pode usá-lo IFS=$'\n\b'
. Tornar o backspace um separador é bastante estranho. Você não precisa IFS
do que está fazendo de qualquer maneira.
OLDIFS=$IFS
...
IFS=$OLDIFS
Observe que isso restaura o valor antigo de IFS
apenas se IFS
foi definido inicialmente. Se IFS
inicialmente não foi definido, isso define IFS
a sequência vazia, que é completamente diferente. No ksh, bash ou zsh, se você precisar configurar IFS
temporariamente, poderá escrever seu código em uma função e tornar IFS
local essa função. Em outras conchas, você precisa ter cuidado com o caso não definido.
`find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
Nunca use substituição de comando na saída de find
.
- Isso divide a saída nos caracteres em
$IFS
. Se você definir IFS
uma nova linha, isso dividirá a saída em novas linhas, mas você ainda não poderá lidar com nomes de arquivos que contenham novas linhas.
- Não apenas o resultado da substituição de comandos é dividido em palavras, mas cada palavra é usada como um padrão global. Se você arquivos chamados
A[12].pdf
, A1.pdf
e A2.pdf
, você vai acabar com A1.pdf A2.pdf A1.pdf A2.pdf
. Você pode desativar o globbing com set -f
(e voltar set +f
a usar com ), mas aqui (como na maioria das vezes) o caminho certo é não usar a substituição de comando.
Use o -exec
argumento para find
(ou, se o seu sistema tiver -print0
, você pode usá-lo find … -print0 | xargs -0 …
; isso só é útil para atuar em vários arquivos de uma só vez, se você precisar de portabilidade para sistemas Linux antigos ou sistemas OpenBSD atuais que ainda -print0
não possuem -exec … {} +
).
ORIGTS=`stat -c "%Y" $f`
# [transform $f]
touch -t $ORIGTS $f
Observe que faltam aspas duplas $f
(elas não são necessárias se estes são os resultados da divisão e você não mudou IFS
desde então e o globbing está desativado, mas, na verdade, sempre coloque aspas duplas, a menos que você saiba por que pode ' não os deixe ligados).
Isso é desajeitado e não portátil ( stat
não existe em todos os sistemas e seus argumentos são diferentes nos diferentes sistemas em que existe). touch
tem uma opção portátil para definir um arquivo para o timestamp de outro arquivo: touch -r REFERENCE_FILE FILE
. Eu recomendaria uma das duas abordagens:
- Se possível, primeiro transforme o arquivo original em um novo arquivo, depois chame
touch -r
para definir a data do novo arquivo e, finalmente, mova o novo arquivo para o local. É melhor garantir que a saída esteja correta antes que algo aconteça na entrada; caso contrário, se a transformação for interrompida por qualquer motivo (por exemplo, falta de energia), você perderá dados.
- Se a transformação for uma caixa preta sobre a qual você não tem controle, poderá usar
touch -r
duas vezes: uma vez para salvar a data do arquivo original em um arquivo temporário vazio (que será criado automaticamente) e depois após a transformação para restaurar a data usando o arquivo temporário.
Portanto:
find /mnt/library/Libra/Libra/Ashfords -name '*.pdf' \
-exec sh -c 'transform "$0" to "$0.tmp" && touch -r "$0" "$0.tmp" && mv -f "$0.tmp" "$0"' {} \;
IFS
parece incomum. Deseja realmente dividir em backspace (\b
)? Veja unix.stackexchange.com/questions/9496/… para obter algumas dicas.