我想列出带有附加信息的目录,即 LOCKED 或 FREE 状态,具体取决于名为“lock”的文件的存在。
示例:-我有一个名为“dir”的主目录,-在该目录中有子目录“dir1”、“dir2”、“dir3”,-“dir2”包含文件“lock”,其他目录不包含文件这样的文件名, - 我想要一个结果列表看起来像:
dir1 - FREE
dir2 - LOCKED
dir3 - FREE
如何用 Bash 做到这一点?
我想列出带有附加信息的目录,即 LOCKED 或 FREE 状态,具体取决于名为“lock”的文件的存在。
示例:-我有一个名为“dir”的主目录,-在该目录中有子目录“dir1”、“dir2”、“dir3”,-“dir2”包含文件“lock”,其他目录不包含文件这样的文件名, - 我想要一个结果列表看起来像:
dir1 - FREE
dir2 - LOCKED
dir3 - FREE
如何用 Bash 做到这一点?
这应该工作:
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 锁定
该脚本将目录名称作为参数,并打印出下一级目录的锁定状态(根据您的定义):
#!/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
现在是一个简单的单行:
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。完毕。