我正在尝试编写一个脚本来过滤我的wiki文件到那些具有相同名称和没有目录的目录。我会进一步阐述。
这是我的文件系统:
我需要做的是打印那些名称中包含目录的文件列表,以及另一个没有目录的文件。
所以我的最终目标是:
与dirs:
Docs
Eng
Python
RHEL
To_do_list
articals
没有dirs:
orphan.txt
orphan2.txt
orphan3.txt
我设法用dirs获取这些文件。这是我的代码:
getname () {
file=$( basename "$1" )
file2=${file%%.*}
echo $file2
}
for d in Mywiki/* ; do
if [[ -f $d ]]; then
file=$(getname $d)
for x in Mywiki/* ; do
dir=$(getname $x)
if [[ -d $x ]] && [ $dir == $file ]; then
echo $dir
fi
done
fi
done
但坚持让那些没有。如果这是错误的做法,请澄清正确的方法。
任何帮助表示赞赏。感谢。
答案 0 :(得分:1)
这可能不是最有效的方法,但您可以获取所有文件,删除扩展名,并检查是否没有具有该名称的目录。
像这样(未经测试的代码):
for file in Mywiki/* ; do
if [ -f "$d" ]; then
dirname=$(getname "$d")
if [ ! -d "Mywiki/$dirname" ]; then
echo "$file"
fi
fi
done
答案 1 :(得分:1)
这是一个快速尝试。
for file in Mywiki/*.txt; do
nodir=${file##*/}
test -d "${file%.txt}" && printf "%s\n" "$nodir" >&3 || printf "%s\n" "$nodir"
done >with 3>without
这无耻地使用非孤儿的标准输出。也许更健壮地打开另一个单独的文件描述符。
除非您特别要求shell对令牌的值执行空白标记化和通配符扩展,否则还要注意如何引用所有内容。 Here's the scoop on that.
答案 2 :(得分:-1)
列出当前目录中的所有文件
list1=`ls -p | grep -v /`
列出当前目录中没有扩展名的所有文件
list2=`ls -p | grep -v / | sed 's/\.[a-z]*//g'`
列出当前目录中的所有目录
list3=`ls -d */ | sed -e "s/\///g"`
现在,您可以使用list2和list3的交集获得所需的目录列表。 Intersection of two lists in Bash