在bash promt上键入此代码
if [ -d "$DIRECTORY" ]; then # if true this block of code will execute fi
要检查多个目录,请使用以下代码:
if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then # Things to do fi
(1)
[ -d Piyush_Drv1 ] && echo ""Exists"" || echo "Not Exists"
(2)
[ `find . -type d -name Piyush_Drv1 -print | wc -l` -eq 1 ] && echo Exists || echo "Not Exists"
(3)
[[ -d run_dir && ! -L run_dir ]] && echo Exists || echo "Not Exists"
如果发现上述方法之一存在问题。
同 ls 命令;目录不存在的情况 - 显示错误消息
ls
$ [[[ ls -ld SAMPLE_DIR| grep ^d | wc -l -eq 1]]&&回声存在||不存在 -ksh:not:not found [没有这样的文件或目录]
ls -ld SAMPLE_DIR| grep ^d | wc -l
或者对于完全没用的东西:
[ -d . ] || echo "No"
检查目录是否存在,否则创建一个
[ -d "$DIRECTORY" ] || mkdir $DIRECTORY
file="foo" if [[ -e "$file" ]]; then echo "File Exists"; fi;
这个答案 包装成shell脚本
$ is_dir ~ YES $ is_dir /tmp YES $ is_dir ~/bin YES $ mkdir '/tmp/test me' $ is_dir '/tmp/test me' YES $ is_dir /asdf/asdf NO # Example of calling it in another script DIR=~/mydata if [ $(is_dir $DIR) == "NO" ] then echo "Folder doesnt exist: $DIR"; exit; fi
function show_help() { IT=$(CAT <<EOF usage: DIR output: YES or NO, depending on whether or not the directory exists. ) echo "$IT" exit } if [ "$1" == "help" ] then show_help fi if [ -z "$1" ] then show_help fi DIR=$1 if [ -d $DIR ]; then echo "YES"; exit; fi echo "NO";
下面可以找到,
find . -type d -name dirname -prune -print
那里有很好的解决方案,但如果你不在正确的目录中,最终每个脚本都会失败。所以这样的代码:
if [ -d "$LINK_OR_DIR" ]; then if [ -L "$LINK_OR_DIR" ]; then # It is a symlink! # Symbolic link specific commands go here rm "$LINK_OR_DIR" else # It's a directory! # Directory command goes here rmdir "$LINK_OR_DIR" fi fi
只有在执行的时候,您才会成功执行,因为您所在的目录中有一个您正在检查的子目录。
我理解这样的初始问题:验证目录是否存在,而不管用户在文件系统中的位置如何。所以使用'find'命令可能会有所帮助:
dir=" " echo "Input directory name to search for:" read dir find $HOME -name $dir -type d
这个解决方案很好,因为它允许使用通配符,这是搜索文件/目录时的一个有用功能。唯一的问题是,如果搜索到的目录不存在,'find'命令将不会向stdout打印任何内容(根据我的口味,这不是一个优雅的解决方案),并且仍将是零退出。也许有人可以改进这一点。
该 ls 命令与 -l (long listing)选项返回有关文件和目录的属性信息。 特别是第一个角色 ls -l 输出通常是一个 d 或者a - (短跑)。如果是 d 列出的那个是肯定的目录。
-l
ls -l
d
-
只有一行中的以下命令将告诉您是否给定 的 ISDIR 强> 变量包含目录的路径:
ISDIR
[[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && echo "YES, $ISDIR is a directory." || echo "Sorry, $ISDIR is not a directory"
实际用法:
[claudio@nowhere ~]$ ISDIR="$HOME/Music" [claudio@nowhere ~]$ ls -ld "$ISDIR" drwxr-xr-x. 2 claudio claudio 4096 Aug 23 00:02 /home/claudio/Music [claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && echo "YES, $ISDIR is a directory." || echo "Sorry, $ISDIR is not a directory" YES, /home/claudio/Music is a directory. [claudio@nowhere ~]$ touch "empty file.txt" [claudio@nowhere ~]$ ISDIR="$HOME/empty file.txt" [claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && echo "YES, $ISDIR is a directory." || echo "Sorry, $ISDIR is not a directoy" Sorry, /home/claudio/empty file.txt is not a directory
我发现了 双托架 的版本 test 使编写逻辑测试更自然:
test
if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then echo "It's a bona-fide directory" fi
一个简单的脚本来测试是否存在目录或文件:
if [ -d /home/ram/dir ] # for file "if [-f /home/rama/file]" then echo "dir present" else echo "dir not present" fi
一个简单的脚本来检查目录是否存在:
mkdir tempdir # if you want to check file use touch instead of mkdir ret=$? if [ "$ret" == "0" ] then echo "dir present" else echo "dir not present" fi
上面的脚本将检查目录是否存在
$? 如果最后一个命令成功则返回“0”否则返回非零值。 假设 tempdir 已经存在了 mkdir tempdir 将给出如下错误:
$?
tempdir
mkdir tempdir
mkdir:无法创建目录 tempdir :文件存在
使用 -e 检查将检查文件,这包括目录。
-e
if [ -e ${FILE_PATH_AND_NAME} ] then echo "The file or directory exists." fi
实际上,您应该使用几种工具来获得防弹方法:
DIR_PATH=`readlink -f "${the_stuff_you_test}"` # Get rid of symlinks and get abs path if [[ -d "${DIR_PATH}" ]] ; Then # now you're testing echo "It's a dir"; fi
只要您使用,无需担心空格和特殊字符 "${}" 。
"${}"
注意 [[]] 不像便携式 [] 但是,由于大多数人使用现代版本的Bash(因为毕竟大多数人甚至不使用命令行:-p),所以好处大于麻烦。
[[]]
[]
要检查目录是否存在,您可以使用简单的if结构,如下所示:
if [ -d directory/path to a directory ] ; then #Things to do else #if needed #also: elif [new condition] # things to do fi
你也可以做负面的
if [ ! -d directory/path to a directory ] ; then # things to do when not an existing directory
的 注意 强> :小心,在开口和闭合支架的两侧留空空间。
使用相同的语法,您可以使用:
-e: any kind of archive -f: file -h: symbolic link -r: readable file -w: writable file -x: executable file -s: file size greater than zero
缩短形式:
[ -d "$DIR" ] && echo "Yes"
if [ -d "$DIRECTORY" ]; then # Here if $DIRECTORY exists fi
要检查shell脚本中是否存在目录,可以使用以下命令:
if [ -d "$DIRECTORY" ]; then # Control will enter here if $DIRECTORY exists. fi
或者检查目录是否不存在:
if [ ! -d "$DIRECTORY" ]; then # Control will enter here if $DIRECTORY doesn't exist. fi
但是,作为 Jon Ericson 指出,如果您没有考虑到目录的符号链接也会通过此检查,则后续命令可能无法按预期工作。 例如。运行这个:
ln -s "$ACTUAL_DIR" "$SYMLINK" if [ -d "$SYMLINK" ]; then rmdir "$SYMLINK" fi
会产生错误信息:
rmdir: failed to remove `symlink': Not a directory
因此,如果后续命令需要目录,则可能必须区别对待符号链接:
if [ -d "$LINK_OR_DIR" ]; then if [ -L "$LINK_OR_DIR" ]; then # It is a symlink! # Symbolic link specific commands go here. rm "$LINK_OR_DIR" else # It's a directory! # Directory command goes here. rmdir "$LINK_OR_DIR" fi fi
请特别注意用于包装变量的双引号,其原因由8jean解释 在另一个答案 。
如果变量包含空格或其他异常字符,则可能导致脚本失败。
请注意 的 -d 强> 测试可以产生一些令人惊讶的结果:
$ ln -s tmp/ t $ if [ -d t ]; then rmdir t; fi rmdir: directory "t": Path component not a directory
文件在:“什么时候目录不是目录?”答案是:“当它是目录的符号链接时。”一个稍微更全面的测试:
if [ -d t ]; then if [ -L t ]; then rm t else rmdir t fi fi
您可以在Bash手册中找到更多信息 Bash条件表达式 和 [ 内置命令 和 [[ 复合命令 。
[
[[
请记住在引用变量时始终将变量用双引号括起来 一个bash脚本。这些天孩子们长大了,他们的目录名称中可以有空格和许多其他有趣的字符。 (太空!回到我的日子,我们没有任何奇特的空间!;))
有一天,其中一个孩子将运行你的脚本 $DIRECTORY 调成 "My M0viez" 你的剧本会爆炸。你不希望这样。所以使用它。
$DIRECTORY
"My M0viez"
if [ -d "$DIRECTORY" ]; then # Will enter here if $DIRECTORY exists, even if it contains spaces fi