Bash - 列出了附加信息的目录

时间:2012-12-14 10:09:28

标签: bash

我想列出带有附加信息的目录,即LOCKED或FREE状态,具体取决于是否存在名为“lock”的文件。

实施例: - 我有一个名为“dir”的主目录, - 在该目录中有子目录“dir1”,“dir2”,“dir3”, - “dir2”包含文件“lock”,其他dirs不包含具有此类文件名的文件, - 我希望结果列表看起来像:

dir1 - FREE
dir2 - LOCKED
dir3 - FREE

如何用Bash做到这一点?

3 个答案:

答案 0 :(得分:2)

这应该有效:

for i in *  #loop through current directory
do
if [ -d "$i" ] #if you see a directory
then
 cd "$i";  #go in
 echo -n "$i "
 if [ -f "lock" ] #see if the file is there
 then
 echo "Locked"
 else
 echo  "Free" 
 fi
 cd ..
fi
done

你必须在父目录中运行它(我想你的情况为dir

示例运行:

aman@aman-VPCEB14EN:~/test$ ls -R
.:
dir1  dir2  dir3  dir4  dir5  try.sh

./dir1:

./dir2:
lock

./dir3:

./dir4:

./dir5:
lock
aman@aman-VPCEB14EN:~/test$ ./try.sh 
dir1 Free
dir2 Locked
dir3 Free
dir4 Free
dir5 Locked

答案 1 :(得分:2)

此脚本将目录名作为参数,并打印出一级目录的锁定状态(根据您的定义):

#!/bin/bash
find $1 -mindepth 1 -maxdepth 1 -type d -print0 | while read -r -d '' dirname
do
  [[ -f "$dirname/lock" ]] && STATUS="LOCKED" || STATUS="FREE"
  echo "${dirname#$1} - $STATUS"
done

使用示例:

[me@home]$ ls -R dir/
dir/:
dir1  dir2  dir3  dir with spaces

dir/dir1:

dir/dir2:
lock

dir/dir3:

dir/dir with spaces:

[me@home]$ ./status_check.sh dir/
dir1 - FREE
dir with spaces - FREE
dir2 - LOCKED
dir3 - FREE

P.S。 find-while习语的(看似不必要的复杂)用法确保脚本不会破坏包含空格的文件名。请参阅thisthis

答案 2 :(得分:1)

现在简单的单行:

for DIR in */ ; do echo -n "$DIR - " ; ls "${DIR}lock" >/dev/null 2>&1 && echo LOCKED || echo FREE ; done

使用*/,您只能获得目录。 echo -n省略了尾随换行符,因此只打印目录名称。然后在每个目录中查找文件lock,并丢弃ls的输出(有效和错误)。如果ls成功,你回复FREE,否则你回复LOCKED。完成。