如何将文件列表提供给 bash 脚本

How to feed a list of files into a bash script

我在将大量文件名输入命令时遇到问题(git for windows git,我认为是 cygwin)bash shell.

这是适用于少量参数的基本命令:git filter-branch -f --tree-filter 'rm -rf file1 directory2 file3 file4'但是,我有大约 1500 个文件名。

我试过:git filter-branch -f --tree-filter 'rm -rf file1 directory2... all 1500 names here' 但我收到错误消息:

/mingw64/bin/git: Argument list too long

我试过使用 for 循环:git filter-branch -f --tree-filter 'for f in $(cat files.txt) ; do rm -fr "$f" ; done' 并且它在整个循环中运行并出现错误:

cat: files.txt: No such file or directory

仅供参考 - files.txt 内容如下所示:

./file1 
./directory2 
./file3 
./file4

然后我尝试了:git filter-branch -f --tree-filter < cat files.txtcat files.txt | git filter-branch -f --tree-filter,但我收到关于语法不正确的错误 - 它显示了 'help' 对话框。例如:

usage: git filter-branch [--setup ] [--subdirectory-filter ] [--env-filter ] [--tree-filter ] [--index-filter ] [--parent-filter ] [--msg-filter ] [--commit-filter ] [--tag-name-filter ] [--original ] [-d ] [-f | --force] [--state-branch ] [--] [...]

然后我想也许我可以像这样将参数添加到文件中:git filter-branch -f

文件:

--tree-filter './file1 ./directory2 ./file3 ./file4'

但是我又得到了 'help' 对话。

我确定有办法做到这一点,但我的 unix-fu 太弱了。请帮忙!


回应@dash-o:

我试过了,但出现错误:

C:/Program Files/Git/mingw64/libexec/git-core\git-filter-branch: eval: line 414: unexpected EOF while looking for matching `'' C:/Program Files/Git/mingw64/libexec/git-core\git-filter-branch: eval: line 415: syntax error: unexpected end of file

files.txt 每行列出一个文件。但是,rm -rf 要求它们在一行中并且以 space 分隔。

我试图将文件名放在一行中,但出现了不同的错误:

C:/Program Files/Git/mingw64/libexec/git-core\git-filter-branch: line 414: rm -rf .vs ./file1 ./directory2: command not found tree filter failed: 'rm -rf ./file1 ./directory2'

也许单引号被转义了,没有包含在 rm 命令中?

试一试,只要确保您在 files.txt 所在的路径中即可避免 "No such file or directory" 错误:

for f in $(cat files.txt); do git filter-branch -f --tree-filter 'rm -rf '"$f"'' ; done

对于大量文件的情况,单独遍历每个文件可能会很耗时。对于这些情况,请考虑使用 xargs 将参数批处理在一起的能力(基于参数的最大数量、最大命令行大小等)。

xargs -L50 < files.txt  | xargs -I@ git filter-branch -f --tree-filter "'rm -rf @'"

第一个xargs纯粹用来排列块参数,每个50个文件。如果需要,可以对其进行自定义以包含行大小限制。

第二个 xargs 将对每 50 个参数执行 git 过滤器。您可能需要处理引用,因为我无法在 windows).

上使用 git 测试命令