gpt4 book ai didi

linux - 规避参数列表在脚本中太长(for循环)

转载 作者:行者123 更新时间:2023-12-03 10:00:09 25 4
gpt4 key购买 nike

我已经看到了一些关于这个的答案,但作为一个新手,我真的不明白如何在我的脚本中实现它。
这应该很容易(对于那些可以这样的人)
我正在使用一个简单的

for f in "/drive1/"images*.{jpg,png}; do 
但这只是重载并给了我
Argument list too long
这个最容易解决的方法是什么?

最佳答案

参数列表太长解决方法
参数列表长度受您的配置限制。

getconf ARG_MAX
2097152
但是在讨论了 细节和系统 (os) 限制之间的差异(参见 comments from that other guy )之后,这个问题似乎是错误的:
关于评论的讨论,OP尝试了类似的东西:
ls "/simple path"/image*.{jpg,png} | wc -l
bash: /bin/ls: Argument list too long
这是因为操作系统限制,而不是 !
但用 OP 代码测试,这工作得很好
for file in ./"simple path"/image*.{jpg,png} ;do echo -n a;done | wc -c
70980
像:
 printf "%c" ./"simple path"/image*.{jpg,png} | wc -c
通过减少固定部分来减少线长:
第一步:您可以通过以下方式减少参数长度:
cd "/drive1/"
ls images*.{jpg,png} | wc -l
但是当文件数量增加时,你会再次出现问题......
更一般的解决方法:
find "/drive1/" -type f \( -name '*.jpg' -o -name '*.png' \) -exec myscript {} +
如果您希望它不是递归的,您可以添加 -maxdepth 作为第一个选项:
find "/drive1/" -maxdepth 1 -type f \( -name '*.jpg' -o -name '*.png' \) \
-exec myscript {} +
在那里, myscript 将以文件名作为参数运行。 myscript 的命令行一直构建到达到系统定义的限制。
myscript /drive1/file1.jpg '/drive1/File Name2.png' /drive1/...
man find :
   -exec command {} +
This variant of the -exec action runs the specified command on
the selected files, but the command line is built by appending
each selected file name at the end; the total number of invoca‐
tions of the command will be much less than the number of
matched files. The command line is built in much the same way
that xargs builds its command lines. Only one instance of `{}'

铭文样本
你可以创建你的脚本
#!/bin/bash

target=( "/drive1" "/Drive 2/Pictures" )

[ "$1" = "--run" ] && exec find "${target[@]}" -type f \( -name '*.jpg' -o \
-name '*.png' \) -exec $0 {} +

for file ;do
echo Process "$file"
done
然后你必须使用 --run 作为参数来运行它。
  • 使用 任何 个文件! (递归!参见 maxdepth 选项)
  • 允许多个target
  • 允许文件和目录名称中的空格和特殊字符
  • 您可以直接在文件上运行相同的脚本,无需 --run :
     ./myscript hello world 'hello world'
    Process hello
    Process world
    Process hello world

  • 使用
    使用数组,您可以执行以下操作:
    allfiles=( "/drive 1"/images*.{jpg,png} )
    [ -f "$allfiles" ] || { echo No file found.; exit ;}

    echo Number of files: ${#allfiles[@]}

    for file in "${allfiles[@]}";do
    echo Process "$file"
    done

    关于linux - 规避参数列表在脚本中太长(for循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65071471/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com