标签: coreutils

为什么 'ls' 突然用单引号中的空格包裹项目?

我只是注意到,在我的一台机器上(运行 Debian Sid),每当我输入ls任何带空格的文件名时,它周围都有单引号。

我立即检查了我的别名,却发现它们完好无损。

wyatt@debian630:~/testdir$ ls
'test 1.txt'  test1.txt
wyatt@debian630:~/testdir$ alias
alias ls='ls --color=auto'
alias wget='wget --content-disposition'
wyatt@debian630:~/testdir$
Run Code Online (Sandbox Code Playgroud)

(图片)

另一个测试,文件名中包含单引号(也回答了 jimmij 的请求):

wyatt@debian630:~/testdir$ ls
'test 1.txt'  test1.txt  'thishasasinglequotehere'\''.txt'
wyatt@debian630:~/testdir$ touch "'test 1.txt'"
wyatt@debian630:~/testdir$ ls
''\''test 1.txt'\'''  test1.txt
'test 1.txt'          'thishasasinglequotehere'\''.txt'
Run Code Online (Sandbox Code Playgroud)

(图片)

使用新的 coreutils-8.26 输出进行更新(诚然,这不那么令人困惑,但默认情况下仍然令人恼火)。感谢 Pádraig Brady 提供此打印输出:

$ ls
"'test 1.txt'"   test1.txt
'test 1.txt'    "thishasasinglequotehere'.txt"

$ ls -N
'test 1.txt'  test1.txt
test 1.txt    thishasasinglequotehere'.txt
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我如何正确停止它?

需要明确的是,我自己将 ls 设置为自动彩色输出。它从来没有在事物周围加上引号。

我正在运行bash,coreutils 8.25。

有什么方法可以在不重新编译的情况下解决这个问题?

编辑:出现 coreutils 开发人员选择)打破惯例并将其设为全局默认值。 …

ls debian coreutils upgrade quoting

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

正确锁定 shell 脚本?

有时您必须确保同一时间只有一个 shell 脚本实例正在运行。

例如,通过 crond 执行的 cron 作业本身不提供锁定(例如默认的 Solaris crond)。

实现锁定的常见模式是这样的代码:

#!/bin/sh
LOCK=/var/tmp/mylock
if [ -f $LOCK ]; then            # 'test' -> race begin
  echo Job is already running\!
  exit 6
fi
touch $LOCK                      # 'set'  -> race end
# do some work
rm $LOCK
Run Code Online (Sandbox Code Playgroud)

当然,这样的代码有竞争条件。有一个时间窗口,其中两个实例的执行都可以在第 3 行之后才能访问$LOCK文件。

对于 cron 作业,这通常不是问题,因为两次调用之间有几分钟的间隔。

但是事情可能会出错——例如,当锁定文件在 NFS 服务器上时——挂起。在这种情况下,多个 cron 作业可以在第 3 行阻塞并排队。如果NFS服务器再次处于活动状态,那么你已经惊群并行运行的作业。

在网上搜索我发现工具lockrun似乎是该问题的一个很好的解决方案。使用它,您可以运行一个需要像这样锁定的脚本:

$ lockrun --lockfile=/var/tmp/mylock myscript.sh
Run Code Online (Sandbox Code Playgroud)

您可以将其放在包装器中或从您的 crontab 中使用它。

lockf()如果可用,它使用(POSIX) 并回退到flock()(BSD)。并且lockf()对 NFS …

cron nfs shell-script coreutils lock

71
推荐指数
6
解决办法
6万
查看次数

“是”如何如此快速地写入文件?

让我举个例子吧:

$ timeout 1 yes "GNU" > file1
$ wc -l file1
11504640 file1
Run Code Online (Sandbox Code Playgroud)

$ for ((sec0=`date +%S`;sec<=$(($sec0+5));sec=`date +%S`)); do echo "GNU" >> file2; done
$ wc -l file2
1953 file2
Run Code Online (Sandbox Code Playgroud)

在这里您可以看到该命令在一秒钟内yes写入11504640行,而我只能1953在 5 秒内使用 bashforecho.

正如评论中所建议的,有各种技巧可以提高效率,但没有一个能与以下速度相媲美yes

$ ( while :; do echo "GNU" >> file3; done) & pid=$! ; sleep 1 ; kill $pid
[1] 3054
$ wc -l file3
19596 file3
Run Code Online (Sandbox Code Playgroud)

$ timeout 1 bash -c 'while …
Run Code Online (Sandbox Code Playgroud)

bash coreutils write yes

61
推荐指数
3
解决办法
8823
查看次数

cp -L 与 cp -H

问题

使用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无法创建符号链接。例如,源树中的符号链接(到常规文件)将被复制到目标树中的常规文件中。

我确实知道符号链接不是常规文件,但是……我承认我对这里的解释感到困惑。

linux command-line options cp coreutils

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

为什么 cp --reflink=auto 不是默认行为?

为什么cp --reflink=auto不是默认行为?启用它会造成任何伤害吗?

是否可以在编译时启用它,以便在整个系统中使用它,而不仅仅是在交互式 shell 中使用?

coreutils btrfs

53
推荐指数
4
解决办法
1万
查看次数

驻留在我系统的 /bin 中的 `[` 程序是什么?

我最近在浏览我的 Fedora/bin文件夹时注意到一个名为[. 我确实尝试在互联网上搜索有关这方面的更多信息,但找不到任何有用的信息。运行它strace似乎也不会产生任何对仔细检查有用的东西。

那是什么?我应该惊慌吗?这可能是系统妥协的结果吗?我应该运行它吗?它属于任何包吗?

fedora gnu coreutils

32
推荐指数
2
解决办法
2670
查看次数

将命令的输出存储在 shell 变量中

我有一个操作cut,我想将结果分配给一个变量

var4=echo ztemp.xml |cut -f1 -d '.'
Run Code Online (Sandbox Code Playgroud)

我收到错误:

ztemp.xml 不是命令

var4never的值被赋值;我正在尝试为其分配以下输出:

echo ztemp.xml | cut -f1 -d '.'
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

command-line scripting bash shell-script coreutils

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

GNU“安装”-d 标志——它是如何工作的?

我正在尝试编写一个 makefile 规则来复制目录,维护其结构,并且由于我们的 makefile 中的所有其他规则都使用install,我希望保持一致。

在联机帮助页中,它说:

概要

   install [OPTION]... [-T] SOURCE DEST
   install [OPTION]... SOURCE... DIRECTORY
   install [OPTION]... -t DIRECTORY SOURCE...
   install [OPTION]... -d DIRECTORY...

   -d, --directory
          treat all arguments as directory names; create all components of
          the specified directories
Run Code Online (Sandbox Code Playgroud)

好的,这听起来像我需要的……但这些标志没有意义。您如何指定要安装到的目标目录?

我尝试通过在本地硬盘上创建任意目录结构来进行基本测试:

~>tree test
test
??? a
?   ??? b
?       ??? c
?           ??? e.txt
??? d

4 directories, 1 file
Run Code Online (Sandbox Code Playgroud)

然后运行install -d并查看创建的内容:

~>install -d test test2
~>tree test2
test2

0 directories, 0 files
Run Code Online (Sandbox Code Playgroud)

什么都没有发生! …

coreutils

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

为什么 ln -s 接受单个参数

> cd /tmp
> ln -s foo
> ls -alhF /tmp
lrwxrwxrwx 1 user user    3 Jul 29 14:00 foo -> foo
Run Code Online (Sandbox Code Playgroud)

这是一个错误ln还是有一个将文件符号链接到自身的用例?

这是与coreutils 8.21-1ubuntu5.1.

coreutils symlink ln

30
推荐指数
2
解决办法
2173
查看次数

date 命令中的“1 个月前”选项如何工作?

我不确定这是否会在当天获得过去的日期,或者是否只需要 30 或 31 天。

例如

如果当前日期是March 28th,则必须是 1 个月前February 28th,但是当它是 时会发生什么March 30th

设想

我想每天备份一些文件,脚本将在当前日期内保存这些文件,$(date +%Y%m%d)格式20150603_bckp.tar.gz为我的条件:

past_month = $(date -d "-1 month" +%Y%m%d)
day = $(date +%d)
if [ "$day" != 01 ] && [ "$day" != 15 ]
then
    rm /path/of/files/${past_month}_bckp.tar.gz
    echo "Depuration done"
else
    echo "Keep file"
fi
Run Code Online (Sandbox Code Playgroud)

但是我想知道,当日期是 30 日、31 日甚至过去的二月示例时会发生什么?它会保留那些文件吗?或删除第一天的文件?

当它是 31 日时,净化将执行,所以如果过去一个月只有 30 天,这将删除第 1 天的文件?

我希望我有所暗示。

coreutils date

29
推荐指数
1
解决办法
6万
查看次数

标签 统计

coreutils ×10

bash ×2

command-line ×2

shell-script ×2

btrfs ×1

cp ×1

cron ×1

date ×1

debian ×1

fedora ×1

gnu ×1

linux ×1

ln ×1

lock ×1

ls ×1

nfs ×1

options ×1

quoting ×1

scripting ×1

symlink ×1

upgrade ×1

write ×1

yes ×1