触摸 for 循环

mk1*_*024 1 bash

ls 给我:

10 11 12 12L 13 16 702 702L
Run Code Online (Sandbox Code Playgroud)

等等,我想创建文件

10_ 11_ 12_ 12L_ 13_
Run Code Online (Sandbox Code Playgroud)

等等。但,

$ for f in *; do touch "$f_"; done
Run Code Online (Sandbox Code Playgroud)

给我:

touch: cannot touch '': No such file or directory
touch: cannot touch '': No such file or directory
touch: cannot touch '': No such file or directory
touch: cannot touch '': No such file or directory
Run Code Online (Sandbox Code Playgroud)

还,

$ for f in *; do touch $f_; done
Run Code Online (Sandbox Code Playgroud)

给出:

Try 'touch --help' for more information.
touch: missing file operand
Try 'touch --help' for more information.
touch: missing file operand
Try 'touch --help' for more information.
touch: missing file operand
Run Code Online (Sandbox Code Playgroud)

我在此目录中有 100 多个文件,并且不打算在没有脚本的情况下执行此操作。

des*_*ert 7

可以这样做:

for f in *; do touch "${f}_"; done
Run Code Online (Sandbox Code Playgroud)

man bash/扩展说:

当参数是一个多于一位的位置参数时,或者当参数后跟一个不被解释为名称的一部分的字符时,需要大括号。

然而,这需要touch每个文件,这是非常低效的。更好的方法是让printf文件列表,在奇怪的文件名的情况下以零分隔,并touch在需要的帮助下仅在需要时调用xargs

printf '%s_\0' * | xargs -0 touch
Run Code Online (Sandbox Code Playgroud)