我读过,因为 Bash 中的文件路径可以包含除空字节(零值字节$'\0'
)之外的任何字符,所以最好使用空字节作为分隔符。例如,如果将 的输出find
发送到另一个程序,则建议使用该-print0
选项(对于find
具有它的版本)。
但是,虽然这样的事情工作正常(打印由换行符分隔的文件路径 - 别担心,这只是一个演示,我实际上并没有在实际脚本中这样做):
find -print0 \
| while IFS= read -r -d $'\0' ; do echo "$REPLY" ; done
Run Code Online (Sandbox Code Playgroud)
这样的事情就不会工作:
for file in * ; do echo -n "$file"$'\0' ; done \
| while IFS= read -r -d $'\0' ; do echo "$REPLY" ; done
Run Code Online (Sandbox Code Playgroud)
当我只尝试for
-loop 部分时,我发现它只是将所有文件名打印在一起,中间没有空字节。
为什么是这样?这是怎么回事?
它是正确使用某些特殊字符,如+
,&
,'
,.
。(点)和,
(逗号),基本上,在文件名中。
我知道您可以使用-
并且_
没有问题,但是在进行一些研究时,我无法找到有关其他符号的确切信息;有人说你可以,有人说你不能,还有一些人说“不鼓励”使用它们(无论这意味着什么)。
当我从 Shotwell 中的相机导入图片时,它也会导入视频剪辑。这有点烦人,因为我想将我的视频存储在另一个文件夹中。我尝试编写一个 bash 命令来执行此操作,但没有成功。
我需要一个满足以下要求的命令:
任何帮助,将不胜感激!
编辑:我在 Ubuntu 中使用默认 shell,这意味着某些命令是别名等。
编辑 2:我自己尝试过(不是复制部分,只是文件列表部分)。我打开 extglob 并运行以下命令:
$ ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'
Run Code Online (Sandbox Code Playgroud)
这列出了一切。我尝试在它的末尾使用 grep,但对于如何让它不匹配我给它的模式没有最模糊的想法。extglob 开关对 grep 没有太大帮助,即使它对其他命令有帮助。