我想列出带有附加信息的目录,即LOCKED或FREE状态,具体取决于是否存在名为“lock”的文件。
实施例: - 我有一个名为“dir”的主目录, - 在该目录中有子目录“dir1”,“dir2”,“dir3”, - “dir2”包含文件“lock”,其他dirs不包含具有此类文件名的文件, - 我希望结果列表看起来像:
dir1 - FREE
dir2 - LOCKED
dir3 - FREE
如何用Bash做到这一点?
答案 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习语的(看似不必要的复杂)用法确保脚本不会破坏包含空格的文件名。请参阅this和this。
答案 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。完成。