如何根据unix或linux中的grep,sed或awk获取unix目录中文件的名称?

问题描述:

如何根据unix或linux中的sed,grep或awk获取unix目录中文件的名称?如何根据unix或linux中的grep,sed或awk获取unix目录中文件的名称?

不过,我觉得我可以做这样的事情:

for i in $(ls /tmp/files/date*); do 
     if [ $(cat $i | head -n 1 | grep -c "6") >= 1 ] ; then 
      echo $i 
     fi 
    done 

我需要它来搜索所有文件的某个目录(只在它们各自的第一行),然后返回哪些文件具有在串他们。

感谢, 添

+1

不解析'ls':HTTP://mywiki.wooledge。org/ParsingLs – 2012-04-10 17:36:44

+0

不要使用'ls',glob本身就足够了(并且不会像'ls'那样容易出现空白/丑陋的字符问题)。 – Kevin 2012-04-10 17:37:00

您可以简化您的脚本一点点,得到期望的结果:

for i in /tmp/files/date*; do 
    if head -n 1 "$i" | grep -q "6"; then 
     basename "$i" 
    fi 
done 
+0

+1。我会添加'-q'选项来grep并引用'“$ i”'。 – 2012-04-10 17:37:11

+0

@glennjackman:是的,你完全正确。 – bmk 2012-04-10 17:42:31

+0

谢谢!!!这正是我所期待的。 – cyberboxster 2012-04-13 16:58:38

您可以使用basename获得路径的最后部分(文件名)

$ basename '/usr/bin/env' 
env 

你的代码有很多问题。我会按照重要性或多或少的方式去处理它们。

  1. 你错过then
    if [ $(cat $i | head -n 1 | grep -c "6" >= 1) ] ; then
  2. 不解析ls,水珠就足够了:
    for i in /tmp/files/date*; do
  3. >=应该是子shell之外:
    if [ $(cat $i | head -n 1 | grep -c "6") >= 1 ] ; then
  4. >=应该是-ge来比较数字:
    if [ $(cat $i | head -n 1 | grep -c "6") -ge 1 ] ; then
  5. 报价"$i"和子shell,你并不需要引用6:
    if [ "$(cat "$i" | head -n 1 | grep -c 6)" -ge 1 ] ; then
  6. grep返回值可以用来控制,因为你想让它安静if(切换-c-q和你不需要计数:
    if cat "$i" | head -n 1 | grep -q 6 ; then
  7. 你不需要猫在这里:
    if head -n 1 "$i" | grep -q 6 ; then

所以:

for i in /tmp/files/date*; do 
    if head -n 1 "$i" | grep -q 6 ; then 
     echo $i 
    fi 
done 

取决于你要与列表中做什么,你可能需要去了解它以不同的方式(find,可能)。

+0

你的结果脚本违反了你的观点#1。 ;-) – 2012-04-11 15:32:30

+0

@DennisWilliamson哎呀。修正了,谢谢你的发现。 – Kevin 2012-04-11 15:38:37

“我需要它搜索某个目录中的所有文件(每个文件只有它们的第一行),然后返回哪些文件中包含该字符串。”

发现,grep的的组合,削减

find a_certain_directory_name -exec \grep -n -H -m 1 my_search_string {} \; | cut -f 1,2 -d : | grep -e ":1\$" | cut -f 1 -d :