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 IFSdo que está fazendo de qualquer maneira.
OLDIFS=$IFS
...
IFS=$OLDIFS
Observe que isso restaura o valor antigo de IFSapenas se IFSfoi definido inicialmente. Se IFSinicialmente não foi definido, isso define IFSa sequência vazia, que é completamente diferente. No ksh, bash ou zsh, se você precisar configurar IFStemporariamente, poderá escrever seu código em uma função e tornar IFSlocal 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 IFSuma 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.pdfe 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 +fa usar com ), mas aqui (como na maioria das vezes) o caminho certo é não usar a substituição de comando.
Use o -execargumento 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 -print0nã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 IFSdesde 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 ( statnão existe em todos os sistemas e seus argumentos são diferentes nos diferentes sistemas em que existe). touchtem 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 -rpara 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 -rduas 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"' {} \;
IFSparece incomum. Deseja realmente dividir em backspace (\b)? Veja unix.stackexchange.com/questions/9496/… para obter algumas dicas.