相关疑难解决方法(0)

如何运行 find -exec?

我想在当前目录中找到包含文本“chrome”的文件。

$ find . -exec grep chrome
find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

find

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

如何仅循环遍历 bash 中的目录?

我有一个文件夹,里面有一些目录和一些文件(有些是隐藏的,以点开头)。

for d in *; do
 echo $d
done
Run Code Online (Sandbox Code Playgroud)

将遍历所有文件和目录,但我只想遍历目录。我怎么做?

bash directory files

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

为什么循环查找的输出是不好的做法?

这个问题的灵感来自

为什么使用 shell 循环处理文本被认为是不好的做法?

我看到这些结构

for file in `find . -type f -name ...`; do smth with ${file}; done
Run Code Online (Sandbox Code Playgroud)

for dir in $(find . -type d -name ...); do smth with ${dir}; done
Run Code Online (Sandbox Code Playgroud)

几乎每天都在这里使用,即使有些人花时间对这些帖子发表评论,解释为什么应该避免这种东西......
看到此类帖子的数量(以及有时这些评论被简单地忽略的事实)我想我还不如问一个问题:

为什么循环find的输出是不好的做法,为 返回的每个文件名/路径运行一个或多个命令的正确方法是find什么?

find filenames files for

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

在每次更换之前让 sed 要求确认?

有没有办法让 sed 在每次更换之前要求我确认?在 vim 中使用 replace 时类似于 'c' 的东西。

sed 会这样做吗?

vim sed

41
推荐指数
2
解决办法
1万
查看次数

是否可以安全地使用`find -exec sh -c`?

我正在尝试将findtoecho 0用于某些文件,但显然这仅适用于sh -c

find /proc/sys/net/ipv6 -name accept_ra -exec sh -c 'echo 0 > {}' \;
Run Code Online (Sandbox Code Playgroud)

但是使用sh -cwithfind -exec让我觉得很不安,因为我怀疑引用问题。我稍微摆弄了一下,显然我的怀疑是有道理的:

  • 我的测试设置:

    martin@dogmeat ~ % cd findtest 
    martin@dogmeat ~/findtest % echo one > file\ with\ spaces
    martin@dogmeat ~/findtest % echo two > file\ with\ \'single\ quotes\'
    martin@dogmeat ~/findtest % echo three > file\ with\ \"double\ quotes\"
    martin@dogmeat ~/findtest % ll
    insgesamt 12K
    -rw-rw-r-- 1 martin martin 6 Sep 17 12:01 file with "double …
    Run Code Online (Sandbox Code Playgroud)

shell find

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

查找和通配符(和通配符)

我尝试查找*.e*与另一个文件 ( md.tpr)位于同一目录中的一些文件 ( )。我需要使用以下内容列出它们(用于进一步处理):

find . -name md.tpr -execdir ls *.e* \;
Run Code Online (Sandbox Code Playgroud)

我尝试了此命令的一些变体和其他一些变体(包括单引号传递给的命令-execdir或将其作为sh -c 'ls *.e*'eval 'ls *.e*'仅举几例)。似乎通配符在传递给-exec或时不起作用-execdir。运行上述命令时出现的错误是:

ls: *.e*: No such file or directory
Run Code Online (Sandbox Code Playgroud)

就像一个健全性检查一样,我做-execdir pwd了它并打印了它应该打印的内容,所以看起来它是 globbing 的问题,因为这些*.e*文件确实存在于这个测试列出的目录中。

现在,我能够以一种不太优雅的方式解决这个问题,但它让我感到困惑,为什么通配符和通配符在这里不起作用。有任何想法吗?还是我完全偏离了轨道?

我使用 bash 3.2.25(旧的,但我在该系统上没有管理员权限)。

另外,有趣的是,如果我这样做

find ~ -name .bashrc -maxdepth 2 -execdir ls -d .b* \;
Run Code Online (Sandbox Code Playgroud)

除非从$HOME.

bash find

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

如何按文件类型查找文件?

我知道我可以使用find:找到文件find . -type f -name 'sunrise'。结果示例:

./sunrise
./events/sunrise
./astronomy/sunrise
./schedule/sunrise
Run Code Online (Sandbox Code Playgroud)

我也知道我可以确定文件的文件类型:file sunrise. 结果示例:

sunrise: PEM RSA private key
Run Code Online (Sandbox Code Playgroud)

但是如何按文件类型查找文件?

例如my-find . -type f -name 'sunrise' -filetype=bash-script

./astronomy/sunrise
./schedule/sunrise
Run Code Online (Sandbox Code Playgroud)

find file-command files file-types

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

如何使用 linux find 命令打印内容而不是文件名?

我有成千上万个类似这样命名的 unl 文件cbs_cdr_vou_20180624_603_126_239457.unl。我想使用以下命令打印这些文件中的所有行。但它只给我文件名。我不需要文件名,我只需要这些文件中的内容。

find -type f -name 'cbs_cdr_vou_20180615*.unl'  > /home/fifa/cbs/test.txt
Run Code Online (Sandbox Code Playgroud)

电流输出:

./cbs_cdr_vou_20180615_603_129_152023.unl
./cbs_cdr_vou_20180615_603_128_219001.unl
./cbs_cdr_vou_20180615_602_113_215712.unl
./cbs_cdr_vou_20180615_602_120_160466.unl
./cbs_cdr_vou_20180615_603_125_174428.unl
./cbs_cdr_vou_20180615_601_101_152369.unl
./cbs_cdr_vou_20180615_603_133_193306.unl
Run Code Online (Sandbox Code Playgroud)

预期输出:

8801865252020|200200|20180613100325|;
8801837463298|200200|20180613111209|;
8801845136955|200200|20180613133708|;
8801845205889|200200|20180613141140|;
8801837612072|200200|20180613141525|;
8801877103875|200200|20180613183008|;
8801877167964|200200|20180613191607|;
8801845437651|200200|20180613200415|;
8801845437651|200200|20180613221625|;
8801839460670|200200|20180613235936|;
Run Code Online (Sandbox Code Playgroud)

请注意,对于 cat 命令,我收到错误-bash: /bin/logger: Argument list too long,这就是为什么要使用find而不是cat命令的原因。

linux find cat

10
推荐指数
2
解决办法
2565
查看次数

移动所有不以 .txt 结尾的文件

在目录中,/home/username/data我有文件和目录。这些文件名中的一些以.txt(我将其称为文本文件)结尾,其他的则没有。在子目录中也会发生同样的情况。

调用子目录之一other_files(其完整路径为/home/username/data/other_files/)。

我想移动所有不以to.txt 的根 结尾的文件。/home/username/dataother_files


我可以用循环来做,但这不是我想要的。我想使用命令和管道。我相信这很容易,只是我没有看到。mv, find,grep和 的组合xargs应该这样做,我只是不确定如何。

所以我一直在尝试匹配文本文件(然后想办法匹配除它们之外的所有内容)。在下面,假设我当前的目录是/home/username/data.
首先我选择了find . | grep -E "*\.txt",但这匹配所有文本文件,包括子目录中的文件。
所以我find . | grep -E "\./*\.txt"只是想看看我是否会得到相同的比赛然后朝着我的目标努力,但这并不匹配任何东西,这就是我被卡住的地方。


我该如何去做我在问题开头所描述的事情?

grep bash find xargs filenames

10
推荐指数
2
解决办法
4073
查看次数

$ find -exec cd => 给出错误:=> find: 'cd': No such file or directory

当我运行此命令时,它可以工作:

$ find . -inum 888696 -exec ls '{}' \;
Conversation.pst  Outlook Data File  Outlook Data File.sbd  Trash      Unsent Messages
Inbox.pst     Outlook Data File.msf  Sent.pst       Trash.msf  Unsent Messages.msf
Run Code Online (Sandbox Code Playgroud)

然而,当更换lscd工作:

$ find . -inum 888696 -exec cd '{}' \;
find: ‘cd’: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我知道cd是一个bash内置的,所以我想这里面确实没有任何工作:

$ find . -inum 888696 -exec builtin cd '{}' \;
find: ‘builtin’: No such file or directory
Run Code Online (Sandbox Code Playgroud)

如何cdfind -exec …

bash find cd-command

8
推荐指数
4
解决办法
3600
查看次数

标签 统计

find ×8

bash ×4

files ×3

filenames ×2

cat ×1

cd-command ×1

directory ×1

file-command ×1

file-types ×1

for ×1

grep ×1

linux ×1

sed ×1

shell ×1

vim ×1

xargs ×1