我发现这sudo -u <user> test
可能有效,但我的系统上没有 sudo 命令。
例如
/a d......--x
/a/aa d......--x YES
/b d......---
/b/bb d......--x NO
当我使用root用户时,无法使用test
命令确定“其他”的权限。我发现的相关问题:测试用户文件的有效权限
我发现这sudo -u <user> test
可能有效,但我的系统上没有 sudo 命令。
例如
/a d......--x
/a/aa d......--x YES
/b d......---
/b/bb d......--x NO
当我使用root用户时,无法使用test
命令确定“其他”的权限。我发现的相关问题:测试用户文件的有效权限
我想使用find
命令 with-printf '%h\0'
来打印前导目录,以 nul 字符分隔。由于我使用的是 \0,所以我不需要也不希望 find 引用结果,如 find 联机帮助页的“UNUSUAL FILENAMES”部分所述。
有没有什么方法可以告诉 find “我真的知道我在做什么”,并且在使用该-printf
选项时不进行引用?
我正在编写一个脚本来确定是否find
支持以下原色:
到目前为止,我想出了这个:
find / -mindepth 0 -maxdepth 1 -inum +0 -exec echo "ok:inum+-" \; 2>&1 | head -n 1
仅当该命令能够理解该主节点时,它才应输出“ok:inum+-”。
问题是我依赖 find 来查找匹配项,否则它不会输出任何内容。
理想情况下,测试的主程序不应关心它发现什么,并且应始终执行回显,除非工具因错误而中止。
我意识到我可以放弃-exec echo …
并检查调用的退出代码find
,但是我将如何根据它打印“ok:”字符串?
哦,任何解决方案都必须是每个经过测试的初级的单行解决方案。
设想:
$ tree .
.
├── x1.txt
├── x2.txt
└── x3.txt
0 directories, 3 files
$ find . -name "x1.txt" -prune -o -name "*.txt"
./x1.txt
./x2.txt
./x3.txt
$ find . -name "x1.txt" -prune -o -name "*.txt" -print0
./x2.txt./x3.txt
在这里我们看到这-print0
确实会影响搜索结果。使困惑。
为什么存在-print0
导致find ...
不打印x1.txt
?
-print0
为什么没有find ...
打印x1.txt
?
有人可以向我解释一下这里发生了什么吗?这就是我将我的情况简化为:
# make 20 test gifs out of the same source file.
for i in {1..20}; do cp -p ../some-random-source-file.gif "${i}.gif"; done
# grab, then process them.
while read f; do echo "→ $f"; ffmpeg -i "$f" -y -loglevel quiet "same.mp4"; done < <(find . -maxdepth 1 -type f -iname "*.gif" -printf "%f\n")
→ 11.gif
→ .gif
→ 9.gif
→ .gif
→ 14.gif
→ 9.gif
→ 0.gif
→ 13.gif
→ 7.gif
→ 5.gif
→ 2.gif
→ .gif
→ 3.gif
→ 0.gif
→ 16.gif
→ .gif
→ 8.gif
→ 8.gif
→ .gif
→ 4.gif
我正在尝试处理目录中包含混合文件(gif 和非 gif)的所有 gif。但由于某种原因,当我添加该ffmpeg
步骤时,变量的内容$f
有时会在开始时被切断。
额外信息:
if ! ffmpeg …; then FAILED+=("$f"); fi
${f%.gif}.mp4
,但是......事实证明:该部分甚至与问题的发生无关。我知道流程替换可能会导致计时问题- 但为什么它会在开始而不是在结束时随机切断变量呢?如果这个结构如此不可靠,怎么会有人使用它呢?我还能怎样做呢?
我正在使用 进行搜索sudo find / -name gcc*
。它返回一堆目录,而我只想要文件。但如果我添加-type f
,它就不会列出符号链接,这也是我想要的。如何过滤掉目录,但保留符号链接?
此外,我注意到尽管使用了*
通配符,但它无法列出名为gcc-10
. 不find
支持通配符?还有其他实用程序可以做到这一点吗?
该find
命令有一个方便的-printf
操作符,可以为每个找到的文件/文件夹打印用户指定的元数据。该命令有这样的选项吗ls
?
作为替代方案,我可以将感兴趣的文件名列表提供给
find
而不是ls
,但这似乎就像在飞行中使用大锤一样。我已经有了感兴趣的文件,但我并没有真正“找到”任何东西。
此外,提供路径find
会很棘手,因为我不能只将所需的文件路径附加到命令的末尾find
。该find
命令要求路径位于运算符(或“谓词”)之前。因此,我无法轻松利用“xargs”。
感谢Steeldriver的回答。我认为stat
如果我从头开始,他的使用将是一个解决方案。find
不幸的是,我必须将输出与其他系统(特别是使用's )生成的类似信息进行比较printf
。
以下是一些find
我发现有效的代码习惯用法:
# Option 1
Some Command \
| xargs -n 1 -I{} find {} -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'
# Option 2
Some Command | tr '\n' '\0' \
| xargs -0 -I{} find {} -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'
根据muru 的评论,这里有一个我还没有开始工作的代码习惯用法,因为我的find
Cygwin 的 Gnu 版本早于 4.9 并且无法识别谓词-files0-from
:
Some Command | tr '\n' '\0' \
| find -files0-from - -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'
我有一个非常大的档案,由非常小的文件组成,连接成一个文本文件,并带有“”分隔符。对于较小的档案,我将split
使用“”作为模式进行档案,然后处理生成的文件。然而,在这个存档中,此类文件的数量级约为一亿个——显然,对于将它们全部放入一个目录来说太多了。我创建了文件夹aa
、ab
等,以便尝试将它们移动到创建的目录中。但是,我遇到了问题。我尝试过的事情:
没有用于split
对结果文件执行任何命令的命令。所以我必须用手做。
**
使用将文件移动到目录中find . -name "xaa*" -exec mv {} aa \+
不起作用,因为{}
不在行尾。
-t
用于反转源和目标的标志在我的 Unix 版本中不可用。
我必须将find
into的输出通过管道传输xargs
,才能正常工作。
然而,这太慢了——文件的创建速度比它们的移动速度快得多。
我怀疑xargs
一次处理的文件比使用\+
after
少find -exec
。我尝试添加一个“-R 6000”标志,以便一次运行 6000 个条目;但是,我认为这没有什么区别。
我将 的优先级降低split
到尽可能低。它消耗的 CPU 量没有变化,所以可能也没有影响。
我打开最多七个命令提示符来运行mv
命令(每个命令提示符最后四个字母)——但是,这仍然不够。我会打开更多,但是一旦系统达到七个,响应就太慢了,我不得不停止分裂。ls -l | tail
例如,在等待命令返回某些内容时,源存档会被复制到 USB 。
split
所以我一直在做的是,在此时停止,等待mv
命令赶上,然后重新启动分割。那时我会用来
find -exec rm {} \+
删除我已经拥有的文件;这有点快,所以当它到达我没有的文件时,周围的文件就会减少。
因此,第一次此类迭代持续了约 300 万个文件,下一个约 200 万个文件,下一个约 1.5 个文件。不过,我确信应该有更好的方法。还有什么想法可以尝试吗?
我需要在查找结果中使用完整路径和目录名称。这不起作用:
find ./1cv8 -maxdepth 1 -type d -wholename "./1cv8/*" -exec bash -c 'echo vrunner -src "{}" -o ./builds/"${basename "{}"}"' \;
错误:
bash: ${basename "./1cv8/common"}: bad substitution
bash: ${basename "./1cv8/conf"}: bad substitution
bash: ${basename "./1cv8/x86_64"}: bad substitution
请帮忙
我的目录如下:
音乐:1.mp3、2.flac、3.wav、4.ogg 和 5.mp4
我尝试使用以下命令删除所有扩展名为 .mp3、.wav、.flac 和 .ogg 的文件:
find ./Music -type f -name \('*.mp3' -or -name '*.wav' -or -name '*.flac' -or -name '*.ogg'\) -delete
但它对目录没有任何作用
知道为什么吗?
(顺便说一句,我比音乐目录高一级)