如何将文件列表提供给 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.txt
和 cat 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 测试命令
我在将大量文件名输入命令时遇到问题(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.txt
和 cat 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 测试命令