相信大家日常开发中都会遇到修改多个文件的情况,大多数同学一般都是用鼠标一个个去点的吧,这种工作没啥技术含量,却消耗了我们很多时间,快来看看下面的骚操作,熟练运行之后相信你会直呼真香~
常见场景
批量修改文件名
修改 src 目录下的所有 index.scss 文件为 index.module.scss
bash
#index.scss文件改为index.module.scss
find src -type f -name "index.scss" -exec sh -c 'mv "$0" "$(dirname "$0")/index.module.scss"' {} \;
-
find src
:脚本将在这个目录下搜索文件。 -
-type f
:表示要查找的是文件而不是目录。 -
-name "index.scss"
:指定查找的文件名,即"index.scss"。 -
-exec sh -c 'mv "$0" "index.module.scss"' {} +
:-exec
选项指定在find
找到的每个文件上执行的命令。sh -c
:这部分表示要执行一个shell命令,sh -c 指定执行单个命令字符串,而不必将它写入脚本文件或交互式输入。'mv "$0" "index.module.scss"'
:。使用mv
命令来重命名文件,将文件从原来的"index.scss"重命名为"index.module.scss"。{}
:这是一个占位符,将被替换为find
找到的每个文件的名称。\
:表示执行多次命令,每次一个文件作为参数。还有另外一个选项,+,使用 + 时,find 将多个匹配的文件合并到一起,会将多个匹配的文件一次性传递给 -exec 后面的命令,以提高效率和性能,但是不区分它们所在的目录,可能导致处理重名文件时产生问题,在多个目录可能存在重名文件时不要使用 +。
给所有文件名添加 -test
后缀
bash
find src -name "*.ts" -exec sh -c 'mv "$0" "${0%.ts}-test.ts"' {} \;
-
find ./src -name "*.ts"
:在src目录下查找所有的.ts文件。 -
-exec sh -c '...' {} \;
:对每个找到的文件执行shell命令。{}是一个占位符,代表找到的文件。 -
'mv "$0" "-test.ts"'
:使用mv命令将原文件名(" <math xmlns="http://www.w3.org/1998/Math/MathML"> 0 " )重命名为新文件名( 0")重命名为新文件名( </math>0")重命名为新文件名({0%.ts}-test.ts")。这里的{0%.ts}是一个字符串操作语法,它会将参数0(即原文件名)中的.ts删除,然后添加上-test.ts。 -
${0%.scss}
: % 表示通配符,它在字符串操作中用于指示删除字符串中从 % 右边开始匹配的指定后缀,即.scss
直接替换old_为new_
bash
find test -type f -name "old_*.txt" -exec sh -c 'mv "$0" "${0/old_/new_}"' {} +
${0}
:代表命令中的第一个参数,即当前文件的路径。
/old_/new_
:这是替换操作。它表示将字符串${0}
中的第一个匹配到的 "old_" 替换为 "new_"。
所以 ${0/old_/new_}
的作用是将文件名中的 "old_" 替换为 "new_",还有其他字符串操作方法,后面再说。
批量修改文件内容
修改导入文件路径
将文件中引入index.scss改为index.module.scss
shell
grep -rl "import './index.scss'" src/ --include="*.tsx" | xargs sed -i '' "s/import '\.\/index.scss'/import '\.\/index.module.scss'/g"
-
grep -rl "import './index.scss'" src/ --include="*.tsx"
:使用grep
命令在指定目录src/
下查找包含字符串 "import './index.scss'" 的行。具体含义如下:-r
:递归地搜索指定目录下的文件。-l
:只显示包含匹配文本的文件名,而不显示匹配的具体文本内容。--include="*.tsx"
:只搜索扩展名为".tsx"的文件。"import './index.scss'"
:要搜索的字符串。src/
:要搜索的目录。
-
|
:管道操作符,将grep
的输出传递给下一个命令。 -
xargs sed -i '' "s/import '\.\/index.scss'/import '\.\/index.module.scss'/g"
:使用xargs
命令接收grep
的输出(即匹配的文件列表),然后使用sed
命令在这些文件中执行替换操作。xargs
:从标准输入接受参数,按照定界符拆分并遍历参数,将其传递给后续命令,以执行命令批量操作。sed -i '' "s/import '\.\/index.scss'/import '\.\/index.module.scss'/g"
:sed命令用于修改文本内容,这里执行替换操作。-i ''
:表示直接在原始文件上进行替换,并且在进行替换之前将原文件备份为一个空文件(mac下需设置,linux不需要)。"s/import '\.\/index.scss'/import '\.\/index.module.scss'/g"
:这是sed
的替换表达式,s/
表示执行替换操作,用于查找 "import './index.scss'" 并将其替换为 "import './index.module.scss'"。g
表示全局替换,而不仅仅替换第一个匹配项。- 当从标准输入读取数据时,不需要为sed命令指定文件名,因为会默认传入
修改标签类名
修改src目录下所有tsx文件中的className='index'为className='目录名-index'
如文件为 src/pages/coupon/index.tsx 的话 className则改为className='coupon-index'
bash
# 使用 grep -rl + xargs
grep -rl "className='index'" src --include="*.tsx" | xargs -I {} sh -c 'sed -i "" "s/className='\''index'\''/className='\''$(basename $(dirname {}))-index'\''/g" {}'
| xargs -I {} sh -c 'sed -i "" "s/className='\''index'\''/className='\''$(basename $(dirname {}))-index'\''/g" {}'
:这一部分将 grep
命令的输出传递给 xargs
,并使用 xargs
执行一个内联的 shell 命令,该 shell 命令使用 sed
来进行替换操作。具体解释如下:
-
xargs
:从标准输入接受参数,按照定界符拆分并遍历参数,将其传递给后续命令,以执行命令批量操作。 -
-I {}
:-I 选项指定占位符,这部分告诉xargs
将每个输入的行(文件名)替换为{}
,以便在后续命令中使用。 -
sh -c 'sed -i "" "s/className='\''index'\''/className='\''$(basename $(dirname {}))-index'\''/g" {}'
:这是一个内联的 shell 命令,如果命令包含需要在 shell 中解释的复杂脚本、变量替换等,需要使用 sh -c在 shell 环境中执行。-
sed -i "" "s/className='\''index'\''/className='\''$(basename $(dirname {}))-index'\''/g" {}
:-
-i ""
:告诉sed
在原始文件上进行编辑,而不是输出到标准输出。这个选项后面的""
表示在执行替换操作时不创建备份文件。 -
"s/className='\''index'\''/className='\''$(basename $(dirname {}))-index'\''/g"
:s/
:sed
的替换操作符。className='\''index'\''
:这是要查找并替换的文本,其中单引号'\''
用于将单引号嵌套在单引号字符串中,与单引号包裹的内容组合,第一个引号为结束前面的字符串,倒数第一个引号为开始后面的字符串。\'
是转义序列中的单引号,相当于把整个字符串分开,然后在中间加入\'
,还有其他转义序列,后面说。$(basename $(dirname {})
: 表示获取文件所在的目录名,例如src/a/index.tsx
文件,basename
命令会获取到a
g
:表示替换所有匹配项,而不仅仅是第一个匹配项。
-
-
以上命令如果文件名过长,整个命令组合后的长度会超出限制,执行时会出现 xargs: command line cannot be assembled, too long
,遇到这种情况我们可以换种写法:
bash
# 使用 find -exec
find src -name "*.tsx" -exec grep -l "className='index'" {} \; -exec sh -c 'sed -i "" "s/className='\''index'\''/className='\''$(basename $(dirname {}))-index'\''/g" {}' \;
# 使用 grep -rl + while
grep -rl "className='index'" src --include="*.tsx" | while read file; do sed -i "" "s/className='index'/className='$(basename $(dirname $file))-index'/g" "$file"; done
内容删除或提取
将文件中的配置部分提取到另一个文件
例如 taro2 升级到 taro3,文件内的配置都单独提取到config.js文件中了
tsx
/*
其他代码
...
*/
config: Config = {
title: '标题',
...
};
ts
// 提取到 xx.config.ts
export default definePageConfig( {
title: '标题',
...
});
使用以下命令可以快速做完这件事:
bash
grep -rlzE '.*config.*=\s+{([^{}]*)};' test --include="*.tsx" | while read file; do
config_file="${file%.*}.config.ts"
config_content=$(grep -zoP '.*config.*=\s+{[^}]*}' "$file" | sed 's/.*=\s*//' | tr -d '\0')
echo "export default definePageConfig($config_content);" > "$config_file"
sed -iE '/.*config.*= {/,/};/d' $file
done
-
grep -rlzE '.*config.*=\s+{([^{}]*)};' src --include="*.tsx"
:使用 grep 搜索包含匹配文本的文件:-r
:递归搜索目录。-l
:只显示包含匹配文本的文件名。-z
:使用 null 字符('\0')作为文件名分隔符,因为要进行多行匹配所以要换个分隔符。-E
:启用扩展正则表达式。'.*config.*=\s+{([^{}]*)};'
:它匹配包含 "config" 的文本行,后面跟等号和配置对象内容。
-
| while read file; do
:将grep
命令的输出传递给一个while
循环,每次迭代处理一个匹配的文件。 -
config_file="${file%.*}.config.ts"
:用于生成要写入的配置文件的文件名。这里的{file%.*}是一个字符串操作语法,它会将参数0(即原文件名)中的扩展名删除,然后换成.config.ts
。例如,a.tsx
转换为a.config.ts
格式。 -
config_content=$(grep -zoP '\w*\.?config:?\s*\w*\s*=\s+{[^}]*}' "$file" | sed 's/.*=\s*//' | tr -d '\0')
:这部分用于提取配置对象的内容,并将其保存到config_content
变量中。grep -zoP '\w*\.?config:?\s*\w*\s*=\s+{[^}]*}' "$file"
:它查找匹配配置对象的文本,-o 表示只返回匹配的内容不返回整行,整行可能还包含分号等,这里不需要,-P 表示使用 perl 兼容的正则表达式,提供了更多高级的模式匹配功能,包括 \s 特殊字符等。sed 's/.*=\s*//'
:使用sed
删除匹配行中等号及其前面的内容,只保留配置对象的内容。(与/d的区别是/d会删除行,而 // 形式只会删除内容,行会保留)tr -d '\0'
:用于删除结尾的 null 字符。
-
echo "export default definePageConfig($config_content);" > "$config_file"
:用于将提取的配置内容写入.config.ts
文件。重复执行会覆盖。 -
sed -iE '/.*config.*= {/,/};/d' $file
:用于在原文件中删除配置对象的内容。具体解释如下:sed -iE '/.*config.*= {/,/};/d' $file
:正则表达式/.*config.*= {/,/};/
匹配配置对象的起始行和结束行之间的所有内容,起始行和结束行以逗号分隔,然后d
命令删除这些行。
批量删除文件
快速删除src目录下所有扩展名为bak的文件
bash
find src -type f -name "*.bak" -exec rm {} \;
bash
find src -type f -name "*.bak" -print0 | xargs -0 rm -f;
-
-print0
: find 命令的输出是一个以换行符、空格、制表符等特殊字符终止的文件名列表,如果文件名本身包含空格或其他特殊字符,这会导致文件名被错误地解释为多个文件名。 使用-print0则表示文件名以null(\0)分隔,而不是以换行符(\n)等特殊字符分隔。 -
xargs -0
: 指定xargs使用 null 作为定界符。确保在处理包含空格或特殊字符的文件名时,命令能够正确运行。 -
rm -f
: 表示强制删除,即使受保护或只读属性限制
-print0 和 xargs -0 的组合是为了确保处理包含特殊字符或空格等的文件名时不会出现问题。
相关命令和工具
find
find
是一个用于查找文件和目录的命令行工具。find
命令的基本语法如下:
bash
find 起始目录 [匹配条件] [动作]
-
起始目录
:指定开始搜索的目录。 -
匹配条件
:可选,用于指定搜索的匹配条件,如文件名、类型、大小、权限等。这些条件可以通过-name
、-type
、-size
、-perm
等参数来定义。 -
动作
:可选,用于指定在找到匹配文件时执行的操作,如打印文件名、执行命令等。常用的动作包括-print
、-exec
等。
以下是一些示例说明:
查找指定文件名的文件:
bash
find /path/to/search -name "example.txt"
在 /path/to/search
目录及其子目录中查找名为 "example.txt" 的文件。
查找指定文件类型的文件:
bash
find /path/to/search -type f
查找 /path/to/search
目录及其子目录中的所有普通文件。
查找指定目录:
bash
find /path/to/search -type d
这会查找 /path/to/search
目录及其子目录中的所有目录。
查找指定文件大小的文件:
bash
find /path/to/search -size +1M
查找 /path/to/search
目录及其子目录中大小大于 1MB 的文件。
执行命令来处理匹配的文件:
bash
find /path/to/search -name "*.log" -exec rm {} \;
这会查找 /path/to/search
目录及其子目录中所有以 ".log" 结尾的文件,并删除它们。
find
命令的 -exec
选项可以在找到匹配的文件时执行指定的命令。区别在于 -exec
后面的 ;
和 +
:
markdown
- `-exec` 后面使用 `\;`,这表示每次找到匹配的文件时都会执行一次 `rm` 命令,对于每个匹配的文件,`find` 将执行一次 `rm` 命令。
- `-exec` 后面使用 `+`,这表示 `find` 将尝试将多个匹配的文件传递给单个 `rm` 命令, `find` 会收集所有匹配的文件,然后将它们作为参数传递给一个 `rm` 命令。这样更高效,它减少了每次执行命令的开销。
grep
grep
是一个文本搜索工具,它可以在文本文件中搜索与指定模式匹配的行。它是"全局正则表达式打印"(Global Regular Expression Print)的缩写。
基本语法:
bash
grep [选项] 搜索模式 [文件名]
选项
:grep
支持多种选项,用于控制搜索的行为。搜索模式
:是你要查找的文本字符串,可以是普通文本或正则表达式。文件名
:是你要搜索的文件名。如果不提供文件名,grep
将从标准输入(通常是键盘输入)读取文本。
选项概览
以下是一些常用的 grep
选项:
-i
:i
代表 "ignore case",表示不区分大小写搜索。-v
:v
代表 "invert match",表示反转匹配,只显示不匹配的行。-l
:l
代表 "files with matches",表示只显示包含匹配项的文件名,而不是匹配的行。-c
:c
代表 "count",表示只计数匹配的行数,而不显示匹配的行。-r
:r
代表 "recursive",表示递归搜索,用于搜索目录及其子目录中的文件。-E
:E
代表 "extended regex",表示启用扩展正则表达式(支持更多正则表达式语法)。-A
:A
代表 "after context",表示显示匹配行及其后的几行。-B
:B
代表 "before context",表示显示匹配行及其前的几行。-n
:n
代表 "line number",表示显示匹配的行及其行号。-o
:o
代表 "only matching",表示仅显示匹配的文本,而不是整行。
常见用法示例:
使用 -i
选项进行不区分大小写搜索行
假设有一个文本文件 example.txt
包含以下内容:
Apple
Banana
apple
banana
要在不区分大小写的情况下搜索 "apple",可以使用 -i
选项:
bash
grep -i "apple" example.txt
输出:
Apple
apple
使用 -v
选项反转匹配,搜索不匹配的行
假设有一个文本文件 fruits.txt
包含以下内容:
Apple
Banana
Cherry
要查找不包含 "Banana" 的行,可以使用 -v
选项:
bash
grep -v "Banana" fruits.txt
输出:
Apple
Cherry
使用 -l
选项搜索包含匹配项的文件名
bash
grep -l "404" *.log #只显示包含404的日志文件
grep -l "Pattern" file1.txt file2.txt #搜索多个文件
还可以搜索一个目录,举例来说,假设有一个名为 mydir
的目录,它包含以下结构:
markdown
mydir/
file1.txt
file2.txt
subdir/
file3.txt
file4.txt
如果要在 mydir
目录及其子目录中搜索包含 "pattern" 的文件并显示文件名,可以使用以下命令:
perl
grep -rl "pattern" mydir
输出将是:
bash
mydir/file1.txt
mydir/subdir/file3.txt
这将返回所有包含 "pattern" 的文件的路径列表,包括它们的相对路径。
使用 -r
选项递归搜索目录,返回匹配行
假设有一个目录 mydir
包含多个文本文件,我们想要递归搜索整个目录及其子目录中的 "pattern"。
bash
grep -r "pattern" mydir
这将搜索 mydir
目录及其子目录中的所有文件,查找包含 "pattern" 的行。
加上 -l 则返回匹配的文件名,加上 -n 则返回行号。
使用--include
指定范围
bash
grep -rl "apple" src/ --include="*.tsx"
使用 -n
选项显示匹配的行及其行号
假设有一个文本文件 example.txt
包含以下内容:
scss
Line 1
This is Line 2
Line 3
Another Line 3
要显示包含 "Line 3" 的行及其行号,可以使用 -n
选项:
bash
grep -n "Line 3" example.txt
输出:
makefile
3:Line 3
4:Another Line 3
使用 -c
选项计算匹配的行数
假设有一个文本文件 example.txt
包含以下内容:
Apple
Banana
apple
banana
要计算包含 "apple" 的行数,可以使用 -c
选项:
bash
grep -c "apple" example.txt
输出:
2
使用 -E
选项启用扩展正则表达式搜索行
假设我们有一个文本文件 example.txt
包含以下内容:
apple
apples
applies
要查找包含 "apples" 或 "applies" 的行,可以使用 -E
选项启用扩展正则表达式:
bash
grep -E "apples|applies" example.txt
输出:
apples
applies
使用 -P
选项启用Perl正则表达式支持
Perl 兼容的正则表达式通常更强大和灵活,与传统的基本正则表达式(BRE)或扩展正则表达式(ERE)相比,提供了更多高级的模式匹配功能。
-
更复杂的模式匹配:
例如,如果需要匹配连续出现三次或更多的数字,可以使用
{n,}
表示法:bashecho "12345 1234 123 12" | grep -P '\d{3,}'
这将匹配 "12345" 和 "1234",因为它们包含三个或更多的数字。
-
使用特殊字符:
Perl 兼容的正则表达式支持更多的特殊字符和转义序列,如
\b
(单词边界)、\w
(单词字符)、\s
(空白字符)等。bashecho "word1 word2. word3" | grep -P '\b\w+\b'
这将匹配文本中的单词 "word1"、"word2" 和 "word3"。
-
复杂的分组和引用:
Perl 正则表达式允许复杂的分组和反向引用,可以从文本中提取特定模式的内容,在分组后使用匹配结果,使用 \n,其中 n 是你想引用的分组的编号
bashecho "abc123abc" | grep -P '(abc|def)\d+\1'
匹配
abc123abc
,因为 \1 引用了第一个分组(abc
)的结果。
使用 -A
和 -B
选项搜索匹配行及其前后的几行
假设有一个文本文件 example.txt
包含以下内容:
scss
Line 1
Line 2
Match: Line 3
Line 4
Line 5
要显示包含 "Match: Line 3" 的行及其前后的两行,可以使用 -A
和 -B
选项:
bash
grep -A 2 -B 2 "Match: Line 3" example.txt
输出:
scss
Line 1
Line 2
Match: Line 3
Line 4
Line 5
使用 -o
选项仅显示匹配的文本,而不是整行
假设有一个文本文件 example.txt
包含以下内容:
makefile
apple:fruit
banana:fruit
cherry:fruit
要仅显示匹配 "banana" 的文本,可以使用 -o
选项:
bash
grep -o "banana" example.txt
输出:
banana
使用 -z
选项设置null作为终止符
将 null 设置为终止符后,grep
在数据中查找匹配项不会被换行符等特殊字符终端中断。
例如你要匹配的文本中有换行时,需要把终止符设置为null,遇到换行时才不会被中断,从而被匹配
bash
假设要匹配换行的中括号
{
...
};
# 不使用 -z,逐行匹配,默认情况下无法匹配多行文本块
grep -rlE '{[^}]*};' test --include="*.tsx"
# 使用 -z,可以匹配包含换行的多行文本块
grep -rlzE '{[^}]*};' test --include="*.tsx"
当 grep
遇到空格、制表符、换行符或其他特殊字符时,它会根据这些字符将文本划分为多行,然后逐行匹配模式。这是 grep
在文本中查找匹配项的默认行为。
所以你可以理解为使用 -z
后只有在这些特殊字符就可以正常匹配了,遇到了也不会划分新行。
使用 GNU grep
如果你执行完没效果,可能是因为你使用的 BSD grep,BSD grep对多行匹配以及复杂正则的支持不太好,安装下 GNU grep 就可以了:
bash
brew install grep
这会在/usr/local/bin下安装ggrep。apple 芯片如 m2,可能会安装在/opt/homebrew/bin/ggrep
,如果你找不到可以 which ggrep
然后设置 alias grep='/opt/homebrew/bin/ggrep'
,把grep命令链接到ggrep上,就可以正常使用了。
可以使用 grep --version
查看效果。
sed
sed
是一种流编辑器(stream editor),用于文本处理和转换。它在文本流中执行替换、删除、插入等编辑操作,通常与管道一起使用。
基本语法:
bash
sed [选项] '编辑命令' 文件名
[选项]
:sed
可以使用不同的选项来修改其行为,如-i
用于原地编辑文件。'编辑命令'
:指定要执行的编辑操作的一组命令。文件名
:要处理的文件名。
示例说明:
替换文本:
使用 sed
s/
可以轻松替换文本。例如,要将文件中的所有 "apple" 替换为 "banana":
bash
sed 's/apple/banana/' filename.txt
原地编辑文件:
如果要在原始文件上执行替换操作,可以使用 -i
选项。例如,将所有 "apple" 替换为 "banana" 并在原始文件上保存更改:
bash
sed -i 's/apple/banana/' filename.txt
# mac
sed -i '' 's/apple/banana/' filename.txt
删除行:
删除包含 "unwanted" 的所有行:
bash
sed '/unwanted/d' filename.txt
插入文本:
sed
可以在匹配到的行前或后插入文本。例如,在每一行前插入 "Prefix: ":
bash
sed -i '' 's/^/Prefix: /' filename.txt
多个编辑操作:
将文件中所有 "apple" 替换为 "banana" 并在每行前添加 "Item: ":
bash
sed -e 's/apple/banana/' -e 's/^/Item: /' filename.txt
正则表达式匹配:
sed
支持使用正则表达式进行更复杂的文本匹配和替换。例如,将所有以数字开头的行替换为 "Number: ":
bash
sed 's/^[0-9]\+/Number: /' filename.txt
反向引用:
sed
支持创建捕获组并引用,使用( 和 ) 来创建捕获组
bash
echo "This is some text with parentheses." | sed 's/.*\(some text\).*/\1/'
echo "This is some text with parentheses." | sed -r 's/.*(some text).*/\1/'
启用扩展正则表达式
使用 -r 启用扩展的正则表达式,可以使用更多的元字符和语法来编写你的正则表达式。
默认情况下,sed 使用基本正则表达式语法,其中特殊字符如 +、?、| 等不具备特殊含义,除非在它们前面加上反斜杠 \。使用 -r 选项,这些特殊字符可以直接使用,而不需要转义。
bash
# 使用扩展正则表达式语法
echo "apple banana cherry" | sed -r 's/(apple|banana)/fruit/'
# 不使用扩展正则表达式语法,需要转义 |
echo "apple banana cherry" | sed 's/\(apple\|banana\)/fruit/'
多行处理:
sed
可以处理多行文本。例如,删除包含 "start" 和 "end" 之间的文本:
bash
sed '/start/,/end/d' filename.txt
执行多个编辑命令:
您可以将多个编辑命令组合在一起以执行复杂的文本操作。例如,将 "apple" 替换为 "banana",并删除包含 "unwanted" 的行:
bash
sed -e 's/apple/banana/' -e '/unwanted/d' filename.txt
xargs
xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。
之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有这个必要,所以就有了 xargs 命令。
简单点说就是 xargs 可以遍历参数
xargs
的基本语法如下:
bash
command | xargs [options] command_to_run
其中:
command
是产生要传递给xargs
的数据的命令。[options]
是可选的xargs
选项。command_to_run
是要执行的命令,该命令将接受从xargs
获取的参数。
以下是一些 xargs
的常用选项和示例说明:
格式化文本:以空格分隔
将 ls
命令的输出传递给 echo
命令以列出当前目录的文件,以空格分隔
bash
ls | xargs
使用 -n
选项 :指定每个 xargs
命令执行的参数数量
每次执行 xargs 命令时带的参数,默认为所有参数
bash
ls | xargs -n 2
这将每次将两个文件名传递给 echo
。
使用 -I
选项:指定替代标记,在特定位置插入参数。
使用 -I 指定一个替换字符串 {},这个字符串在 xargs 扩展时会被替换掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次,即相当于 -n1
bash
echo "file1 file2" | xargs -I {} mv {} /destination
{}
将替换为从 echo
中获取的文件名。
使用 -0
选项:处理带有空格或特殊字符的文件名。
bash
find . -type f -print0 | xargs -0 rm
-print0
和 -0
一起使用,以便处理文件名中包含空格或特殊字符的文件。
结合 find
命令:查找文件后进行操作
bash
find /path/to/search -name "*.txt" | xargs grep "search_string"
这将查找指定路径下的所有 .txt
文件,并在其中搜索指定的字符串。
bash
find test -type f -name "*.tsx" -print0 | xargs -0 wc -l
这将统计指定路径下的所有 .tsx
文件中的行数。
bash
find . -type f -name "*.log" -print0 | xargs -0 rm -f
批量删除文件
批量下载链接
假如你有一个文件包含了很多你希望下载的 URL,可以使用 xargs下载所有链接:
bash
cat url-list.txt | xargs wget -c
转义序列
转义序列是在编程和计算机科学领域中使用的特殊字符组合,用于表示一些不可见或特殊的字符以及控制字符。这些序列以反斜杠(\
)字符开头,后面跟着一个或多个字符,形成一个编码,表示某种特殊含义。
转义序列通常用于字符串中,以告诉解释器或编译器如何处理这些字符。一些常见的转义序列包括:
\'
:表示单引号。\"
:表示双引号。\\
:表示反斜杠字符。\n
:表示换行(换行符)。\t
:表示水平制表符。\r
:表示回车。\b
:表示退格。\f
:表示换页。\v
:表示垂直制表符。\0
:表示空字符或字符串终止符。\xHH
:表示十六进制值,其中HH
是两个十六进制数字。
转义序列使得在字符串中插入特殊字符成为可能,而不会与字符串的定界符或文本解释器产生冲突。例如,如果你想在一个包含双引号的字符串中插入一个双引号字符,你可以使用 \"
来表示它,以便编译器或解释器知道这个双引号是字符串的一部分,而不是字符串的终止符。
单引号用法
与单引号包裹的字符串进行拼接
bash
echo 'This is a single quote: '\'' in a single-quoted string.'
# This is a single quote: ' in a single-quoted string.
echo \''Hello, world!'\'
# 'Hello, world!'