【问题标题】:print names subdirectories with specific suffix打印带有特定后缀的子目录
【发布时间】:2016-03-17 18:19:57
【问题描述】:

我想打印所有子目录中的文件名(我已经有了),但是取决于子目录我想在名称后添加一个特定的后缀。

对于子目录 gas_station 我要添加后缀 50,对于子目录 golf_course 我要添加后缀 51。

这是我所拥有的,但它并不完全有效:

#!/bin/bash

#lists the subdirectories, these are 'gas_station' and 'golf_course'
for i in $(ls -d */); do 

    if ${i%%/} = 'gas_station'

        then

            find /home/apples/dataset/small_train_B/g/${i%%/}/* -type f -printf "g/"${i%%/}"/""%f 50\n" 
        else

            find /home/apples/dataset/small_train_B/g/${i%%/}/* -type f -printf "g/"${i%%/}"/""%f 51\n" 

    fi

done

它打印出以下内容:

...
g/gas_station/00000997.jpg 51
g/gas_station/00000998.jpg 51
g/golf_course/00000017.jpg 51
...

但是,我需要这个:

...
g/gas_station/00000997.jpg 50
g/gas_station/00000998.jpg 50
g/golf_course/00000017.jpg 51
...

【问题讨论】:

  • 如果特殊情况的数量很少(在您的情况下为 1),那么只运行 2 个不同的查找(一个生成 50 个后缀,一个生成 51 个后缀)不是更简单吗?
  • 您的结果清楚地表明比较失败。那时 ${%%/} 的价值是多少?
  • 问题是你没有使用test 命令(又名[)来测试相等性。但这是一种不必要的拜占庭方法。
  • @rpy 感谢您的建议!但是似乎已经给出了解决方案:)

标签: bash if-statement for-loop subdirectory


【解决方案1】:

这不起作用有什么原因吗?

#!/bin/bash
for f in gas_station/*; do
    printf "%s 50\n" "$f"
done
for f in golf_course/*; do
    printf "%s 51\n" "$f"
done

【讨论】:

  • 谢谢,非常有效的解决方案!有没有理由为什么这不会在新的换行符上打印字符串:printf "%s 50" "$f\n"
  • 您将文本作为第一个参数传递,变量如下。我会更新答案。如果您要使用此解决方案,则应将其标记为已接受。
【解决方案2】:

试试这个

for f in $(ls -d */); do
   d=${f%%/}; 
   if [ ${d} = "gas station" ]; 
   then  n=50;
   else  n=51;
   fi; 

   find ${d} -type f -printf "g/"${d}"/""%f $n\n";
done

【讨论】:

  • 解析ls的结果可能会出问题,变量要始终加引号。
【解决方案3】:

您可能会避免摆弄参数修饰符,而只需与正确的字符串进行比较:

if [ "$i" = 'gas_station/' ]

【讨论】:

  • 一个等号可以用来比较,它是 POSIX 标准。您的答案和他的代码中缺少的是test 命令:if [ ${i%%/} = 'gas_station' ]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2015-03-17
  • 1970-01-01
  • 2016-05-03
  • 2017-03-15
  • 2019-10-28
相关资源
最近更新 更多