0

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

示例:-我有一个名为“dir”的主目录,-在该目录中有子目录“dir1”、“dir2”、“dir3”,-“dir2”包含文件“lock”,其他目录不包含文件这样的文件名, - 我想要一个结果列表看起来像:

dir1 - FREE
dir2 - LOCKED
dir3 - FREE

如何用 Bash 做到这一点?

4

3 回答 3

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:
锁

./dir3:

./dir4:

./dir5:
锁
aman@aman-VPCEB14EN:~/test$ ./try.sh
目录 1 免费
dir2 锁定
目录 3 免费
dir4 免费
dir5 锁定
于 2012-12-14T10:29:34.203 回答
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

PS find-while 习惯用法(看似不必要的复杂)确保脚本不会因包含空格的文件名而中断。看到这个这个

于 2012-12-14T11:07:44.010 回答
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。完毕。

于 2012-12-14T11:45:17.933 回答