相关疑难解决方法(0)

如何在命令行上获取目录的大小?

我试图通过使用ls带有选项的命令来获取目录(包含目录和子目录)的大小l。它似乎适用于文件 ( ls -l file name),但如果我尝试获取目录的大小(例如,ls -l /home),我只会得到 4096 字节,尽管总的来说它要大得多。

command-line ls disk-usage

1322
推荐指数
16
解决办法
281万
查看次数

为什么 printf 比 echo 好?

我听说printfecho. 根据我的经验,我只能回忆起一个我不得不使用的实例,printf因为它echo无法将一些文本输入到 RHEL 5.8 上的某个程序中,但printf确实如此。但显然,还有其他差异,我想询问它们是什么以及是否有特定情况下何时使用一种与另一种。

echo text-processing printf

635
推荐指数
4
解决办法
27万
查看次数

如何更改多个文件的扩展名?

我想从改变文件扩展名*.txt*.text。我尝试使用该basename命令,但在更改多个文件时遇到问题。

这是我的代码:

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done
Run Code Online (Sandbox Code Playgroud)

bash shell-script rename

289
推荐指数
14
解决办法
44万
查看次数

如何告诉gzip保留原始文件?

我想使用 gzip 命令行工具压缩文本文件,同时保留原始文件。默认运行以下命令

gzip file.txt
Run Code Online (Sandbox Code Playgroud)

导致修改此文件并重命名它file.txt.gz。而不是这种行为,除了现有的file.txt. 现在我使用以下命令来做到这一点

gzip -c file.txt > file.txt.gz
Run Code Online (Sandbox Code Playgroud)

它有效,但我想知道为什么没有更简单的解决方案来完成如此常见的任务?也许我错过了这样做的选择?

command-line gzip files

243
推荐指数
3
解决办法
28万
查看次数

忘记在 bash/POSIX shell 中引用变量的安全隐患

如果您已经关注 unix.stackexchange.com 一段时间了,那么您现在应该知道,echo $var在 Bourne/POSIX shell(zsh 是例外)中的列表上下文(如)中不加引号的变量具有非常特殊的含义,并且除非你有很好的理由,否则不应该这样做。

在这里的许多问答中详细讨论了它(例如:为什么我的 shell 脚本会因空格或其他特殊字符而窒息?何时需要双引号?shell 变量的扩展以及 glob 和 split 对其的影响引用vs 不带引号的字符串扩展)

自从 70 年代末 Bourne shell 首次发布以来就是这种情况,并且没有被 Korn shell 改变(David Korn 最大的遗憾之一(问题 #7))或者bash大部分复制了 Korn shell,这就是POSIX/Unix 是如何指定的。

现在,我们仍然在这里看到许多答案,甚至偶尔会公开发布未引用变量的 shell 代码。你会认为人们现在已经学会了。

根据我的经验,主要有 3 类人会省略引用他们的变量:

  • 初学者。这些可以被原谅,因为它是一种完全不直观的语法。我们在这个网站上的职责是教育他们。

  • 健忘的人。

  • 即使经过反复锤击也不相信的人,他们认为Bourne shell 的作者肯定没有打算让我们引用所有变量

如果我们揭露与此类行为相关的风险,也许我们可以说服他们。

如果您忘记引用变量,那么最糟糕的事情是什么。真的有那么糟糕吗?

我们在这里谈论什么样的漏洞?

在什么情况下会出现问题?

shell security bash shell-script quoting

241
推荐指数
3
解决办法
3万
查看次数

将命名参数传递给 shell 脚本

有没有什么简单的方法可以将命名参数传递(接收)给 shell 脚本?

例如,

my_script -p_out '/some/path' -arg_1 '5'
Run Code Online (Sandbox Code Playgroud)

并在内部my_script.sh将它们接收为:

# I believe this notation does not work, but is there anything close to it?
p_out=$ARGUMENTS['p_out']
arg1=$ARGUMENTS['arg_1']

printf "The Argument p_out is %s" "$p_out"
printf "The Argument arg_1 is %s" "$arg1"
Run Code Online (Sandbox Code Playgroud)

这在 Bash 或 Zsh 中可能吗?

bash zsh shell-script arguments

192
推荐指数
8
解决办法
28万
查看次数

printf 中的破折号

我正在尝试使用 printf 在 bash 脚本中格式化一些漂亮的输出

例如:

-----------------------  
| This is some output | 
-----------------------
Run Code Online (Sandbox Code Playgroud)

但我偶然发现了一些我不明白的行为。

$ printf "--"
Run Code Online (Sandbox Code Playgroud)

给我错误:

printf: 用法: printf [-v var] 格式 [参数]

$ printf "-stuff"
Run Code Online (Sandbox Code Playgroud)

结果是

-bash: printf: -s: 无效选项

所以显然 printf 认为我试图传递一些参数,而我不是。

同时,完全出于偶然,我找到了这个解决方法:

-----------------------  
| This is some output | 
-----------------------
Run Code Online (Sandbox Code Playgroud)

给我

--- this works now ----
Run Code Online (Sandbox Code Playgroud)

谁能解释这种行为?

bash printf

58
推荐指数
3
解决办法
3万
查看次数

如何从包含数千个文件的文件夹中移动 100 个文件?

我有一个包含数千个文件的目录。如何将 100 个文件(任何文件都可以)移动到另一个位置。

files mv

53
推荐指数
5
解决办法
10万
查看次数

如何“减少”名为“-”的文件?

我不小心创建了一个名称为-(例如,seq 10 > -)的文件。然后我尝试使用less查看它,但它只是挂起。

我知道发生这种情况是因为less -期望输入来自stdin,因此它不会将 解释-为文件名。我试过了,less \-但它也不起作用。

那么,有没有办法表明less-是一个文件而不是标准输入?

我能得到的最好的是:

find -name '-' -exec less {} +
Run Code Online (Sandbox Code Playgroud)

less stdin

17
推荐指数
1
解决办法
3731
查看次数

如何递归列出全部内容恰好为“\n”的所有文件

我有一些失败的实验结果文件,它们的内容恰好是一个\n(换行符)。

我想将它们全部列出(也许使用类似find或 之类的东西grep),以了解这些文件是什么,然后删除它们。

grep bash find

14
推荐指数
3
解决办法
1514
查看次数