如何删除文件名以破折号(连字符或减号)开头的文件-?我通过 ssh 连接到远程 OSX 服务器,并且我的目录中有这个文件:
tohru:~ $ ls -l
total 8
-rw-r--r-- 1 me staff 1352 Aug 18 14:33 --help
...
Run Code Online (Sandbox Code Playgroud)
我怎么--help能从 CLI 中删除?这个问题是我偶尔以不同形式遇到的问题,这些文件很容易创建,但很难摆脱。
我试过使用反斜杠
rm \-\-help
Run Code Online (Sandbox Code Playgroud)
我试过引号
rm "--help"
Run Code Online (Sandbox Code Playgroud)
如何防止将减号(破折号或连字符)字符解释为选项?
我编写了一个在本地执行时运行良好的脚本:
./sysMole -time Aug 18 18
Run Code Online (Sandbox Code Playgroud)
参数"-time"、"Aug"、"18"和"18"成功传递给脚本。
现在,这个脚本被设计为在远程机器上执行,但是从本地机器上的本地目录执行。例子:
ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole
Run Code Online (Sandbox Code Playgroud)
这也很好用。但是当我尝试包含上述参数(-time Aug 18 18) 时,问题就出现了,例如:
ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole -time Aug 18 18
Run Code Online (Sandbox Code Playgroud)
运行该脚本后,我收到以下错误:
bash: cannot set terminal process group (-1): Invalid argument
bash: no job control in this shell
Run Code Online (Sandbox Code Playgroud)
请告诉我我做错了什么,这非常令人沮丧。
通过阅读这个问题,我发现 GNUgrep有一个-X需要参数的选项。奇怪的是,手册页和信息页中都没有提到它。
/* -X is deliberately undocumented. */
Run Code Online (Sandbox Code Playgroud)
进一步看,似乎该-X matcher选项设置用于正则表达式引擎,matcher是一个 grep,egrep,fgrep,awk,gawk,posixawk和perl(截至2.25版本)。
一些这些值是严格相同的现有选项(即grep -G,grep -E,grep -F和grep -P)。另一方面,这三个awk变体没有相应的选项。
有人知道这个选项的实际目的是什么,尤其是使用正则awk表达式引擎之一?有人能告诉我为什么故意没有记录吗?
问题
使用cp -H或复制文件时cp -L,我得到相同的结果:
$ ls -l fileA
fileA -> fileB
$ cp fileA somewhere/ -H
$ ls -l somewhere/
fileA # fileA is a copy of fileB, only renamed, with same properties!
Run Code Online (Sandbox Code Playgroud)
此处的此答案将两个选项描述为类似,除非与-R. 不适合我。Soft- as hardlinked 文件成为它们指向源文件的重命名副本。
cp -H和的正确用法是cp -L什么?这是预期的行为吗?
我试图解决:
man cp两个选项告诉我的结果完全相同,但是info cp的措辞让我更加困惑。也许有人可以帮我分解一下:
-H如果命令行参数指定了符号链接,则复制它指向的文件而不是符号链接本身。但是,复制(保留其性质)通过递归遍历遇到的任何符号链接。
这对我来说听起来很矛盾:我猜»符号链接的性质«是它指向某个地方......
-L, --dereference从符号链接复制时遵循符号链接。使用此选项,cp无法创建符号链接。例如,源树中的符号链接(到常规文件)将被复制到目标树中的常规文件中。
我确实知道符号链接不是常规文件,但是……我承认我对这里的解释感到困惑。
有一些实用程序接受--(双破折号)作为“选项结束”的信号,当文件名以破折号开头时需要:
$ echo "Hello World!" >-file
$ cat -- -file
Hello World!
$ cat -file # cat - -file fails in the same way.
cat: invalid option -- 'f'
Try 'cat --help' for more information.
Run Code Online (Sandbox Code Playgroud)
但是其中一些实用程序在手册页中没有显示这样的选项。
该man页面cat没有一个文件的使用(或有效性)--的说法在任何OS'es的。这并不意味着是 Unix-Linux 的火焰战争,它是一个有效的,而且我相信,有用的关注。
无论是cat,mv,ed(我相信许多人)文件中的手册页这样的选择,我可以找到。
请注意,这./-file是使用--. 例如,source(dot) 命令(并写为.)(通常)不适用于--参数:
$ echo 'echo "Hello World!"' >-file
$ . ./-file
Hello World! …Run Code Online (Sandbox Code Playgroud) 字母使用单破折号和单词使用双破折号的惯例从何而来,为什么继续使用?
例如,如果我输入ls --help,您会看到:
-a, --all do not ignore entries starting with .
-A, --almost-all do not list implied . and ..
--author with -l, print the author of each file
-b, --escape print octal escapes for nongraphic characters
--block-size=SIZE use SIZE-byte blocks
-B, --ignore-backups do not list implied entries ending with ~
...
Run Code Online (Sandbox Code Playgroud)
我尝试使用谷歌搜索- and -- convention即使没有成功的报价。
ls --directory a*时应仅列出以开头的目录a*a问题:
man和info在那里我觉得我完全看?我通常grep在开发时使用,并且有一些扩展我总是想排除(例如*.pyc)。
是否可以创建一个~/.egreprc或类似的东西,并添加过滤以pyc从所有结果中排除文件?
这是可能的,还是我必须创建一个grep以这种方式使用的别名,并调用别名而不是grep?
目前我正在编写一个 Bash 脚本,它具有以下要求:
我知道这getopts将是可移植性方面的首选方式,但 AFAIK 它不支持长选项。
getopt支持长选项,但BashGuide强烈建议反对它:
永远不要使用 getopt(1)。getopt 无法处理空参数字符串或带有嵌入空格的参数。请忘记它曾经存在过。
因此,仍然可以选择手动解析。这很容易出错,会产生相当多的样板代码,而且我需要自己处理错误(我想自己getopt(s)进行错误处理)。
那么,在这种情况下,首选是什么?
cd - 可以在当前目录和上一个目录之间切换。
似乎我以前见过-用作其他命令的参数,但我不记得 if-与cd.
我发现这-不适用于ls.
是- 只用cd吗?