linux 命令参数列表过长以及find用法

1、在一个目录下删除大批量的文件时,当使用 rm -rf 或者rm *会提示参数列表过长

通过修改命令为 :find . -name "*" | xargs rm -rf ‘*‘,成功删除

2、需要把一个目录下的所有文件mv到另外一个目录,如果当前目录文件特别多,简单使用mv 源目录目的目录会提示参数列表过长

通过修改命令为 :ls | xargs -t -I {} mv {} ../matchres/ 可以把当前目录下的所有文件移到 "../matchres"下

3、另外cp 命令也会存在这种情况,解决办法跟 mv的一样。

find -print 和-print0 的区别:

-print 在每个输出后面加一个回车换行符,而-print0则不会。

Linux中find常见用法示例

find path -option [ -print ] [ -exec -ok command ] {} \;

find命令的参数:

pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为‘command‘ { } \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

#-print 将查找到的文件输出到标准输出
#-exec command {} \; —–将查到的文件执行command操作,{} 和 \;之间有空格
#-ok 和-exec相同,只不过在操作前要询用户

-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前

xargs
大多数 Linux 命令都会产生输出:文件列表、字符串列表等。但如果要使用其他某个命令并将前一个命令的输出作为参数该怎么办?例如,file 命令显示文件类型(可执行文件、ascii 文本等);您可以处理输出,使其仅显示文件名,现在您希望将这些名称传递给 ls -l 命令以查看时间戳记。xargs 命令就是用来完成此项工作的。它允许您对输出执行其他某些命令。记住下面这个来自于第 1 部分中的语法:

file -Lz * | grep ASCII | cut -d":" -f1 | xargs ls -ltr

让我们来剖析这个命令字符串。第一个,file -Lz *,用于查找是符号链接或者经过压缩的文件。它将输出传递给下一个命令 grep ASCII,该命令在其中搜索 "ASCII" 字符串并产生如下所示的输出:
alert_DBA102.log: ASCII English text
alert_DBA102.log.Z: ASCII text (compress‘d data 16 bits)
dba102_asmb_12307.trc.Z: ASCII English text (compress‘d data 16 bits)
dba102_asmb_20653.trc.Z: ASCII English text (compress‘d data 16 bits)

由于我们只对文件名感兴趣,因此我们应用下一个命令 cut -d":" -f1,仅显示第一个字段:
alert_DBA102.log
alert_DBA102.log.Z
dba102_asmb_12307.trc.Z
dba102_asmb_20653.trc.Z

现在,我们希望使用 ls -l 命令,将上述列表作为参数进行传递,一次传递一个。xargs 命令允许您这样做。最后一部分,xargs ls -ltr,用于接收输出并对其执行 ls -ltr 命令,如下所示:

ls -ltr alert_DBA102.log
ls -ltr alert_DBA102.log.Z
ls -ltr dba102_asmb_12307.trc.Z
ls -ltr dba102_asmb_20653.trc.Z

因此,xargs 本身虽然没有多大用处,但在与其他命令相结合时,它的功能非常强大。

下面是另一个示例,我们希望计算这些文件中的行数:

$ file * | grep ASCII | cut -d":" -f1 | xargs wc -l
47853 alert_DBA102.log
19 dba102_cjq0_14493.trc
29053 dba102_mmnl_14497.trc
154 dba102_reco_14491.trc
43 dba102_rvwr_14518.trc
77122 total

(注:上述任务还可用以下命令完成:)

$ wc -l ‘file * | grep ASCII | cut -d":" -f1 | grep ASCII | cut -d":" -f1‘

该 xargs 版本用于阐释概念。Linux 可以用几种方法来完成同一个任务;请使用最适合您的情况的方法。

使用该方法,您可以快速重命名目录中的文件。

$ ls | xargs -t -i mv {} {}.bak

-i 选项告诉 xargs 用每项的名称替换 {}。-t 选项指示 xargs 先打印命令,然后再执行。

另一个非常有用的操作是当您使用 vi 打开要编辑的文件时:

$ file * | grep ASCII | cut -d":" -f1 | xargs vi

该命令使用 vi 逐个打开文件。当您希望搜索多个文件并打开它们进行编辑时,使用该命令非常方便。

它还有几个选项。最有用的可能是 -p 选项,它使操作具有可交互性:

$ file * | grep ASCII | cut -d":" -f1 | xargs -p vi
vi alert_DBA102.log dba102_cjq0_14493.trc dba102_mmnl_14497.trc dba102_reco_14491.trc dba102_rvwr_14518.trc ?...

此处的 xarg 要求您在运行每个命令之前进行确认。如果您按下 "y",则执行命令。当您对文件进行某些可能有破坏且不可恢复的操作(如删除或覆盖)时,您会发现该选项非常有用。

-t 选项使用一个详细模式;它显示要运行的命令,是调试过程中一个非常有帮助的选项。

如果传递给 xargs 的输出为空怎么办?考虑以下命令:

$ file * | grep SSSSSS | cut -d":" -f1 | xargs -t wc -l
wc -l
0
$

在此处,搜索 "SSSSSS" 后没有匹配的内容;因此 xargs 的输入均为空,如第二行所示(由于我们使用 -t 这个详细选项而产生的结果)。虽然这可能会有所帮助,但在某些情况下,如果没有要处理的内容,您可能希望停止 xargs;如果是这样,可以使用 -r 选项:
$ file * | grep SSSSSS | cut -d":" -f1 | xargs -t -r wc -l
$

如果没有要运行的内容,该命令退出。

假设您希望使用 rm 命令(该命令将作为 xargs 命令的参数)删除文件。然而,rm 只能接受有限数量的参数。如果您的参数列表超出该限制怎么办?xargs 的 -n 选项限制单个命令行的参数个数。

下面显示了如何限制每个命令行仅使用两个参数:即使向 xargs ls -ltr 传递五个文件,但每次向 ls -ltr 仅传递两个文件。

$ file * | grep ASCII | cut -d":" -f1 | xargs -t -n2 ls -ltr
ls -ltr alert_DBA102.log dba102_cjq0_14493.trc
-rw-r----- 1 oracle dba 738 Aug 10 19:18 dba102_cjq0_14493.trc
-rw-r--r-- 1 oracle dba 2410225 Aug 13 05:31 alert_DBA102.log
ls -ltr dba102_mmnl_14497.trc dba102_reco_14491.trc
-rw-r----- 1 oracle dba 5386163 Aug 10 17:55 dba102_mmnl_14497.trc
-rw-r----- 1 oracle dba 6808 Aug 13 05:21 dba102_reco_14491.trc
ls -ltr dba102_rvwr_14518.trc
-rw-r----- 1 oracle dba 2087 Aug 10 04:30 dba102_rvwr_14518.trc

使用该方法,您可以快速重命名目录中的文件。

$ ls | xargs -t -i mv {} {}.bak

-i 选项告诉 xargs 用每项的名称替换 {}。

我需要将一个用.svn管理的项目改成由CVS来管理,因此,在导入整个项目到CVS中之前,我需要删除所有目录下以及子孙目录下的.svn目录及.svn目录下的的子目录和文件。我一直寻找一种最简单的方法,最后写了一个程序去干这事情。结果同事告诉我只需要一条指令就可以了:find -name ‘.svn‘ |xargs rm -rf
这个教训非常惨重,我一生讨厌傻瓜,可那一刻发现自己是最大的傻瓜!

是的,虽然我们——至少是我,天天使用LINUX但是真的是在高效的使用这个系统吗?不,很多时候并没有花时间去研究它,使用一些固有愚蠢的方式和思维模式在使用这个系统。

1. 建立多级目录:

mkidr 指令用来建立目录,事实上,我们一直都是这么干的。但是在这么使用的时候我们并没有去看它的那些参数提供了哪些额外的功能.

mkidr -p /share/dragon ; 在根目录下建立share目录,并在/share目录下建立dragon目录。mkdir -p guicmd/{bin,lib,src,share/version,doc/{html,pdf,info,man}}
;用来建立一个复杂的项目目录树。

2.find 配合xargs使用:

find -name ‘.svn‘ |xargs rm -rf ;这个不用说了,就是我前面提到的。
xargs更加象一个筛选器,将符合管道传递过来的文件名的内容一并处理掉,这是一个极度高效的方法。

时间: 2024-10-10 10:04:58

linux 命令参数列表过长以及find用法的相关文章

grep命令参数列表过长?我们还有find、xargs和grep

一.问题 捞取当前目录中指定子目录下指定服务器指定时间范围内所有包含有"功勋获取"的日志内容 1.指定子目录 1.2.3.25 .... 1.2.3.83 2.指定服务器 该服务器的日志的文件名格式为: sceneserver.log.(年的后两位,两位数)(月份,不够用0补,两位数)(日,不够用0补,两位数)-(小时,不够用0补,两位数) 如2014年1月22号16点的日志文件名为:sceneserver.log.140122-16 3.指定时间范围 从2014年10月22到2014

rm 参数列表过长

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 14.0px "Helvetica Neue" } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 13.0px "Helvetica Neue"; min-height: 15.0px } p.p3 { margin: 0.0px 0.0px 0.

自定义linux命令参数补全以提高工作效率

我们在使用bash命令时,会经常使用二次tab键进行补齐. 例如我们常用的telnet命令,在输入二次tab键时,会列出当前系统配置的所有主机名,供选择 # 输入 telnet <Tab> <Tab> [huangcihui:/home/huangcihui] telnet ::1 localhost localhost4 localhost4.localdomain4 localhost6 localhost6.localdomain6 localhost.localdomain

Linux命令参数处理 shell脚本函数getopts

getopts 命令 用途 处理命令行参数,并校验有效选项. 语法 getopts 选项字符串 名称 [ 参数 ...] 描述 getopts 的设计目标是在循环中运行,每次执行循环,getopts 就检查下一个命令行参数,并判断它是否合法.即检查参数是否以 - 开头,后面跟一个包含在 options 中的字母.如果是,就把匹配的选项字母存在指定的变量 variable 中,并返回退出状态0:如果 - 后面的字母没有包含在 options 中,就在 variable 中存入一个 ?,并返回退出状

Linux命令、文件和目录的常见用法

1. Linux上的文件管理类命令有哪些,其常用的使用方法及其相关示例演示.    1.1.文件权限管理类命令chown:改变文件所有者chown [OPTINON]...[OWNRR][:[GROUP]] FILE...常用参数 -R :递归修改(改目录及改目录中的目录和文件)示例:#chown -R root /tmp/ligang# chown -R root:root /tmp/ligang chown [OPTION]... --reference=RFILE FILE...示例:#

linux命令ifconfig、route、netstat基本用法

Linux网络属性管理 局域网:以太网,令牌环网 Ethernet: CSMA/CD 冲突域 广播域 MAC:Media Access Control 48bits: 24bits: 24bits: IP: Internet Protocol Routing protocol Routed protocol OSI, TCP/IP tcp/ip分层: application layer transport layer internet layer datalink layer pysical l

linux命令:ssh scp ssh-keygen -t rsa用法

SSH远程连接命令:   用法格式:ssh IPADDR 不指定用户则以当前主机登录系统的用户身份去登录远程主机 ssh [email protected]  通过ssh协议以某用户身份远程登录到某主机 Usage: ssh [email protected]  以root身份通过ssh协议远程登录到192.168.1.100主机 ssh -l USERNAME IPADDR 相当于ssh [email protected]登录模式一样 ssh [email protected] 'COMMON

linux命令(find中-a,-o,not的用法)

sudo find /etc -size +1M -exec echo {} \; #在/etc目录下找文件大小在1M以上的文件并且显示,文件用换行符隔开. sudo find /etc -size +1M | xargs echo #达到-exec相同的功能但是用空格分开寻找到的文件. #-exec后面的{} \;是不能少的. find 紧跟的是指定开始寻找的绝对路径,我取当前路径. find ./ -user 用户名 #find后面接的是开始寻找路径名,它会在这个路径下递归寻找. #-use

linux zip命令 tar命令 【压缩、解压缩】参数列表:

linux zip命令参数列表: -a 将文件转成ASCII模式 -F 尝试修复损坏的压缩文件 -h 显示帮助界面 -m 将文件压缩之后,删除源文件 -n 特定字符串 不压缩具有特定字尾字符串的文件 -o 将压缩文件内的所有文件的最新变动时间设为压缩时候的时间 -q 安静模式,在压缩的时候不显示指令的执行过程 -r 将指定的目录下的所有子目录以及文件一起处理 -S 包含系统文件和隐含文件(S是大写) -t 日期 把压缩文件的最后修改日期设为指定的日期,日期格式为mmddyyyy 举例: 压缩目录