IFS=$(echo -en "\n\b")
Ya que está asumiendo una concha echo -e
y tiene un golpe en su línea shebang de todos modos, puede usar IFS=$'\n\b'
. Hacer que el retroceso sea un separador es bastante extraño. No necesitas IFS
lo que estás haciendo de todos modos.
OLDIFS=$IFS
...
IFS=$OLDIFS
Tenga en cuenta que esto restaura el valor anterior de IFS
solo si IFS
se estableció inicialmente. Si IFS
inicialmente no se configuró, esto se establece IFS
en la cadena vacía, que es completamente diferente. En ksh, bash o zsh, si necesita configurarlo IFS
temporalmente, puede escribir su código en una función y convertirlo en IFS
local. En otros proyectiles, debe tener cuidado con el caso sin configurar.
`find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
Nunca use la sustitución de comandos en la salida de find
.
- Esto divide la salida en los caracteres en
$IFS
. Si establece IFS
una nueva línea, esto divide la salida en nuevas líneas, pero aún no puede manejar los nombres de archivo que contienen nuevas líneas.
- El resultado de la sustitución de comandos no solo se divide en palabras, sino que cada palabra se usa como un patrón global. Si llama a los archivos
A[12].pdf
, A1.pdf
y A2.pdf
terminará con A1.pdf A2.pdf A1.pdf A2.pdf
. Puede desactivar el globbing con set -f
(y volver a activarlo con set +f
), pero aquí (como la mayoría de las veces) la forma correcta es no usar la sustitución de comandos.
Use el -exec
argumento para find
(o si su sistema lo tiene -print0
, puede usarlo find … -print0 | xargs -0 …
en su lugar; esto solo es útil para actuar en múltiples archivos a la vez si necesita portabilidad a sistemas Linux antiguos o sistemas OpenBSD actuales que tienen -print0
pero no -exec … {} +
).
ORIGTS=`stat -c "%Y" $f`
# [transform $f]
touch -t $ORIGTS $f
Tenga en cuenta que le faltan comillas dobles $f
(no son necesarias si estos son los resultados de la división y no ha cambiado IFS
desde entonces y el globbing está desactivado, pero realmente, siempre ponga comillas dobles a menos que sepa por qué puede ' no los dejes puestos).
Esto es torpe y no portátil ( stat
no existe en todos los sistemas, y sus argumentos son diferentes en los diferentes sistemas donde existe). touch
tiene una opción portátil para configurar un archivo a la marca de tiempo de otro archivo: touch -r REFERENCE_FILE FILE
. En su lugar, recomendaría uno de dos enfoques:
- Si puede, primero transforme el archivo original en un nuevo archivo, luego llame
touch -r
para establecer la fecha del nuevo archivo y finalmente mueva el nuevo archivo a su lugar. Es mejor asegurarse de que la salida esté bien antes de que algo le pase a la entrada; de lo contrario, si la transformación se interrumpe por algún motivo (por ejemplo, una falla de energía), perderá datos.
- Si la transformación es un cuadro negro sobre el que no tiene control, puede usar
touch -r
dos veces: una para guardar la fecha del archivo original en un archivo temporal vacío (que se creará automáticamente), luego otra vez después de la transformación para restaurar la fecha usando el archivo temporal.
Así:
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 inusual. ¿Realmente quería dividirse en la tecla de retroceso (\b
)? Consulte unix.stackexchange.com/questions/9496/… para obtener algunos consejos.