GNU目标目录

来自泡泡学习笔记
BrainBs讨论 | 贡献2023年7月13日 (四) 01:35的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

cp、install、ln 和 mv 命令通常在最后一个操作数是目录或目录的符号链接时特殊处理它。例如,如果 dest 是一个目录,那么 'cp source dest' 等同于 'cp source dest/source'。有时这种行为并不是所想要的,所以这些命令支持以下选项,以提供更精细的控制:


'-T'

'--no-target-directory'

当最后一个操作数是目录或目录的符号链接时,不要特殊对待它。这可以避免在共享区域中运行的程序中出现竞争条件。例如,当命令 'mv /tmp/source /tmp/dest' 成功时,并不能保证 /tmp/source 被重命名为 /tmp/dest:如果某个其他进程创建了目录/tmp/dest,它可能被重命名为 /tmp/dest/source。然而,如果 mv -T /tmp/source /tmp/dest 成功,就可以确定 /tmp/source 已经被重命名为 /tmp/dest。


在相反的情况下,当希望将最后一个操作数视为目录并且在否则情况下进行诊断时,可以使用 --target-directory (-t) 选项。


'-t 目录'

'--target-directory=目录'

使用目录作为每个目标文件名的目录组件。


大多数程序的接口都是在处理选项和有限(可能为零)数量的固定位置参数之后,剩余的参数列表要么期望为空,要么是一个条目列表(通常是文件),所有这些条目将完全相同地处理。xargs 程序设计成可与这种约定很好地配合使用。


mv 家族的命令不同寻常之处在于它们带有可变数量的参数,并在最后有一个特殊情况(即目标目录)。这使得执行某些操作变得复杂,例如“将所有文件从当前目录移动到../d/” ,因为 mv * ../d/ 可能会耗尽参数空间,而 ls | xargs ... 没有一种清洁的方式来为每个调用主题命令指定额外的最后一个参数。(可以通过运行一个 shell 命令来实现,但这需要比应有的更多的人力和脑力劳动。)


--target-directory (-t) 选项允许 cp、install、ln 和 mv 程序方便地与 xargs 结合使用。例如,您可以将当前目录中的文件移动到一个兄弟目录 d,像这样:

ls | xargs mv -t ../d --


然而,这种方法无法移动文件名以 '.' 开头的文件。如果使用 GNU find 程序,则可以使用以下命令将这些文件一起移动:

find . -mindepth 1 -maxdepth 1 \ 
   | xargs mv -t ../d


但是,如果当前目录中没有文件,或者任何文件名包含空格或其他特殊字符,上述两种方法都会失败。下面的示例消除了这些限制,需要同时使用 GNU find 和 GNU xargs:

find . -mindepth 1 -maxdepth 1 -print0 \
   | xargs --null --no-run-if-empty \
       mv -t ../d


--target-directory (-t) 和 --no-target-directory (-T) 选项不能结合使用。