IFS=$(echo -en "\n\b")
由于您假设使用的外壳echo -e
,并且无论如何在shebang行中都有bash,因此可以使用IFS=$'\n\b'
。将退格分隔符分隔是很奇怪的。IFS
无论如何,您都不需要做任何事情。
OLDIFS=$IFS
…
IFS=$OLDIFS
请注意,这IFS
仅IFS
在初始设置时恢复旧值。如果IFS
最初未设置,则设置IFS
为空字符串,这是完全不同的。在ksh,bash或zsh中,如果需要IFS
临时设置,则可以在函数中编写代码并将其IFS
局部化。在其他Shell中,您需要注意未设置的情况。
`find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
切勿在的输出上使用命令替换find
。
- 这会将输出分割为中的字符
$IFS
。如果设置IFS
为换行符,则这将在换行符处分割输出,但仍无法处理包含换行符的文件名。
- 命令替换的结果不仅会分解为单词,而且每个单词都将用作全局模式。如果文件叫
A[12].pdf
,A1.pdf
和A2.pdf
,你就结了A1.pdf A2.pdf A1.pdf A2.pdf
。您可以使用set -f
(关闭,然后再使用set +f
)关闭切换功能,但是在这里(大多数情况下),正确的方法是不使用命令替换。
使用-exec
参数来代替find
(或者,如果您的系统具有-print0
,则可以使用find … -print0 | xargs -0 …
;可以使用该参数;仅当您需要可移植到古老的Linux系统或具有-print0
但不具备的当前OpenBSD系统时,才可以一次作用于多个文件-exec … {} +
)。
ORIGTS=`stat -c "%Y" $f`
# [transform $f]
touch -t $ORIGTS $f
请注意,您会丢失双引号$f
(如果这些是拆分的结果,并且IFS
自那时以来您就没有更改过,并且关闭了globbing,则不需要双引号,但实际上,除非您知道为什么可以,否则始终使用双引号。不要把它们放在身上)。
这是笨拙且不可移植的(stat
并非在所有系统上都存在,并且其参数在所存在的不同系统之间也不同)。touch
有一个可移植的选项,用于将文件设置为另一个文件的时间戳:touch -r REFERENCE_FILE FILE
。我建议使用以下两种方法之一:
- 如果可以,请先将原始文件转换为新文件,然后调用
touch -r
以设置新文件的日期,最后将新文件移动到位。最好在输入发生任何事情之前确保输出正常。否则,如果转换由于任何原因(例如电源故障)而中断,则将丢失数据。
- 如果转换是您无法控制的黑匣子,则可以使用
touch -r
两次:一次将原始文件的日期保存在一个空的临时文件(它将自动创建)上,然后在转换后再次保存该日期使用临时文件。
从而:
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
似乎很不正常。您是否真的要在Backspace(\b
)上分割?有关一些提示,请参见unix.stackexchange.com/questions/9496/…。