【问题标题】:Run command for each line in file while file content is parameter [closed]当文件内容为参数时,为文件中的每一行运行命令[关闭]
【发布时间】:2021-01-16 23:30:08
【问题描述】:

我有一个文件,其中包含以下目录的路径名:

~/subdirectory1/subdirectory2/.../a/
~/subdirectory1/subdirectory2/.../b/
...
~/subdirectory1/subdirectory2/.../z/

想要的步骤:

  • 打开文本文件
  • 取一行
  • 将其传递给命令“ls”
  • 管道输出并排除所有出现的结尾“jpg”或“JPG”
  • 将结果路由到新的文本文件(例如“_command_output.log”)

我在玩xargs,但无法让它运行。

这是我目前所拥有的:列出文件并排除所有“jpg”或“JPG”结果。

ls ~/subdirectory1/subdirectory2/.../a/ | awk '!/(jpg|JPG)/'

我把它放到一个循环中:

for i in $(cat ~/textfile-with-pathnames.txt) do
   #do your stuff to $i here
   ##xargs ls;
   ls ${i} | awk '!/(jpg|JPG)/' 
done

再试一次:

cat ~/textfile-with-pathnames.txt  | while read line; 
do 
   ls "$line" | awk '!(jpg|JPG)'; 
done

如何为文件中的每一行运行一个参数并将文件内容用作参数/参数?

【问题讨论】:

    标签: linux bash shell scripting


    【解决方案1】:

    这是一种解决方案(据我所知,这完全符合 POSIX):

    #!/usr/bin/env sh
    
    while read -r line; do
        # Expand ~ in line (see below if you want details on how this works)
        line="$line/"
        line="${HOME}/${line#"~/"}"
    
        # ls line, then inverse case-insensitive grep, and append to file
        ls "$line" | grep -iv '[.]jpg$' >> _command_output.log
    done < directories.txt
    

    如果您想在输出中包含隐藏文件/目录(即,如果您想包含文件名以. 开头的文件/目录),请将ls 替换为ls -a

    grep-i 选项打开不区分大小写,-v 打开反向匹配(-i-v 都是 POSIX 选项)。

    我的脚本假定 directories.txt 只包含目录。


    切向:line="${HOME}/${line#"~/"}" 到底做了什么?

    复杂的line="${HOME}/${line#"~/"}"是基于this answer的。

    这是一个解释,以防我的链接有一天失效。当 shell 解释器查看 line="${HOME}/${line#"~/"}" 时,它看到:

    1. ${HOME}${line#"~/"} 必须展开。
    2. ${HOME} 扩展为 $HOME 变量的内容。
    3. ${line#"~/"} 触发嵌套扩展:"~/" 被解析,但被引用时被视为文字。您可以在此处使用单引号得到相同的结果。
    4. ${line#"~/"} 表达式本身现在已扩展,导致前缀 ~/$line 的值中删除。
    5. 上面的结果现在连接起来了:${HOME} 的扩展,/ 的文字,${line#"~/"} 的扩展。
    6. 最终结果用双引号括起来,在功能上防止分词。

    【讨论】:

    • 如果这是 OP 提出的问题,则应将其作为副本关闭;这已经在How to manually expand a special variable, ex. tilde, in bash 中介绍过了。请参阅How to Answer回答正确提出的问题部分,尤其是关于“之前已被多次询问和回答”的问题的要点。
    • @CharlesDuffy OP 没有询问波浪号扩展。我只是想确保我解释了脚本的每个部分。
    猜你喜欢
    • 2012-12-06
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 2019-02-27
    • 2013-10-17
    相关资源
    最近更新 更多