在bash中实现对文件/目录的识别

时间:2011-07-03 12:33:38

标签: linux bash command-line

我想在bash中编写一个脚本,它会在文件中生成一个目录列表。有必要将每一行标记为文件或目录。

这是我未完成的尝试:

#!/bin/bash
if [ $# -eq 1 ]
then
 if [ -d $1 ]
 then
  touch liste.txt
  ls -l $1 | grep '^-' >> liste.txt
  ls -l $1 | grep '^d' >> liste.txt
 fi
fi

现在我不知道如何在每行“文件”或“目录”中打印。也许有更优雅的方法来解决这个问题。

问候, Haniball

感谢Pavium,

这里是完成的脚本:

#!/bin/bash
if [ $# -eq 1 ]
then
 if [ -d $1 ]
 then
  rm liste.txt
  touch liste.txt
  ls -l $1 | grep '^-' | sed -e "s/^-/File /g" >> liste.txt
  ls -l $1 | grep '^d' | sed -e "s/^d/Directory /g" >> liste.txt
 fi
 more liste.txt
fi

我确信有更优雅的解决方案。也许grep可以抛出,但我不得不将输出限制为只匹配模式的行。

问候, Haniball

3 个答案:

答案 0 :(得分:2)

(
    find . -maxdepth 1 -mindepth 1 -type f -printf 'file %f\n' | sort
    find . -maxdepth 1 -mindepth 1 -type d -printf 'dir %f\n' | sort
) > liste.txt

但也许很简单:

ls -l --group-directories-first

就够了吗?

答案 1 :(得分:2)

你可以使用 sed 作为pavium已经说过。

ls -l $1 | grep '^-' | sed 's/^/file: /' >> liste.txt
ls -l $1 | grep '^d' | sed 's/^/directory: /' >> liste.txt

或者在一个命令中:

ls -l $1 | sed -n -e '/^-/{s/^/file: /p;d;}' -e '/^d/{s/^/directory: /p;d;}' > liste.txt

或者你可以做些不同的事情:

for f in $1/* ; do 
  if [ -d "$f" ]; then
    echo "directory: $f" >> liste1.txt
  else
    echo "file: $f" >> liste1.txt
  fi
done

答案 2 :(得分:0)

stat --printf="%F\t%n\n" * > file.listing