我正在使用diff -r a b
递归比较目录a和b。尽管存在一些断开的链接(a和b目录中的相同断开链接并指向相同的、不存在的目标),但经常会发生这种情况。
diff然后为这些情况输出错误消息并以非零退出代码退出,但是我希望它保持沉默,并以 0 退出,因为目录在我的书中是相同的。
我怎样才能做到这一点?
登录/非登录 shell 的概念与非交互式/交互式 shell 的概念(分别)相同吗?
或者概念正交产生四种不同的组合?
我想获得其清晰的画面.bashrc
,.bash_profile
脚本获得各种情况下采购的,我发现,文章有时可以互换使用这些概念。
有没有办法在逻辑上组合使用find-exec调用的两个 shell 命令?
例如,打印出所有包含字符串 foo 及其出现的.csv文件,我想这样做:
find . -iname \*.csv -exec grep foo {} && echo {} \;
Run Code Online (Sandbox Code Playgroud)
但是bash抱怨“缺少'-exec'的参数”
我试图指示 GNU Make 3.81 在命令失败时不要停止(所以我在命令前加上-
),但我还想检查下一个命令的退出状态并打印一条信息更丰富的消息。但是我下面的 Makefile 失败了:
$ cat Makefile
all:
-/bin/false
([ $$? -eq 0 ] && echo "success!") || echo "failure!"
$
$ make
/bin/false
make: [all] Error 1 (ignored)
([ $? -eq 0 ] && echo "success!") || echo "failure!"
success!
Run Code Online (Sandbox Code Playgroud)
为什么上面的 Makefile 回显“成功!” 而不是“失败!” ?
更新:
遵循并扩展已接受的答案,以下是它的书写方式:
failure:
@-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
success:
@-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo …
Run Code Online (Sandbox Code Playgroud) 当我运行时find
,-execdir
我没有得到我期望的结果。
例如:
mkdir -p a/b/c
find . -type d -execdir touch foo \;
$ tree a
a
??? b
? ??? c
? ??? foo
??? foo
Run Code Online (Sandbox Code Playgroud)
目录c
不包含foo
文件。如何find
在每个目录中访问并在本地执行某些操作?
有没有一种方法可以执行两个目录的递归差异,但只比较(在它们各自的位置)与特定文件名或文件类型谓词匹配的文件?
例如,我想这样做的东西像
diff -r dir-a dir-b -filenames *.java, ivy.xml, build.xml
Run Code Online (Sandbox Code Playgroud)
......甚至更好:
diff -r dir-a dir-b -filetype text
Run Code Online (Sandbox Code Playgroud)
显然,它不是强制性的,diff
因为我认为它是一个咒语,find
也-exec diff
可能会起作用(我只是不知道如何在后一种情况下生成补充文件路径)。
有没有办法编写一个,find
以便-exec
在文件中的一个操作失败时它会中断?
例如 (javac
可以方便地用作可以在某些文件上返回退出代码 1 而没有其他原因的程序):
$ echo "public classXX A{}" >> A.java
$ echo "public class B{}" >> B.java
$ find . -iname \*.java -exec javac {} \;
./A.java:1: error: class, interface, or enum expected
public classXX A{}
^
1 error
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,虽然exec
文件上的A.java
失败(并返回退出代码 1),但find
命令继续执行并编译文件B.java
。有没有办法摆脱find
或者我应该使用某种形式的for
代替?
我的查找版本:
$ find -version | head -1
find (GNU findutils) 4.4.2
Run Code Online (Sandbox Code Playgroud) 有没有办法快速获得目录的准确大小(递归地包括其所有子目录)?我不想要子目录的大小,我只是说它们应该递归地包含在报告的总大小中。
如果没有,有办法获得近似尺寸吗?我正在考虑类似的事情,df
这会为整个文件系统产生快速响应,但这次是针对特定目录(及其子目录)。
du
当给定目录包含数千个子目录时,使用解决方案似乎需要很长时间。
我正在运行一个守护进程,它必须无限期地运行(可以说是“服务”)并希望记录其输出。一个简单的解决方案,如:
./long-running-process > log.out &
Run Code Online (Sandbox Code Playgroud)
...作为文件失败log.out
:
emacs
或vi
为了保持日志文件的大小可管理,我可以使用split
bash 命令:
./long-running-process | split -l 30000
Run Code Online (Sandbox Code Playgroud)
此解决方案使它创建的日志文件的大小保持在可管理的范围内,但是它可能会用完后缀 ( split: output file suffixes exhausted
),或者,如果后缀空间很大,它也可能会耗尽文件系统空间。
因此,我正在寻找一种解决方案,该解决方案将生成许多日志文件,每个日志文件的大小都可以管理,并且还将在它们之间轮换,以便对总磁盘空间进行声明。
是否有这样的解决方案可用,或者我必须在应用程序级别实现它吗?
我如何(递归地)检测目录中以绝对方式而不是相对方式标识其目标的所有符号链接?
由于在移动整个目录树时这些链接很可能会中断,因此我希望有一种识别它们的方法。
如果移动目录树(如果它们碰巧指向目录树的根目录之外),即使是相对链接也可能会中断,但我认为这个问题已解决。