我只是注意到,在我的一台机器上(运行 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 开发人员选择)打破惯例并将其设为全局默认值。 …
有时您必须确保同一时间只有一个 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 …
让我举个例子吧:
$ 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 秒内使用 bashfor和echo.
正如评论中所建议的,有各种技巧可以提高效率,但没有一个能与以下速度相媲美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) 问题
使用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无法创建符号链接。例如,源树中的符号链接(到常规文件)将被复制到目标树中的常规文件中。
我确实知道符号链接不是常规文件,但是……我承认我对这里的解释感到困惑。
为什么cp --reflink=auto不是默认行为?启用它会造成任何伤害吗?
是否可以在编译时启用它,以便在整个系统中使用它,而不仅仅是在交互式 shell 中使用?
我最近在浏览我的 Fedora/bin文件夹时注意到一个名为[. 我确实尝试在互联网上搜索有关这方面的更多信息,但找不到任何有用的信息。运行它strace似乎也不会产生任何对仔细检查有用的东西。
那是什么?我应该惊慌吗?这可能是系统妥协的结果吗?我应该运行它吗?它属于任何包吗?
我有一个操作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)
我怎样才能做到这一点?
我正在尝试编写一个 makefile 规则来复制目录,维护其结构,并且由于我们的 makefile 中的所有其他规则都使用install,我希望保持一致。
在联机帮助页中,它说:
概要
Run Code Online (Sandbox Code Playgroud)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
好的,这听起来像我需要的……但这些标志没有意义。您如何指定要安装到的目标目录?
我尝试通过在本地硬盘上创建任意目录结构来进行基本测试:
~>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)
什么都没有发生! …
> 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.
我不确定这是否会在当天获得过去的日期,或者是否只需要 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 天的文件?
我希望我有所暗示。