提取没有具有相同名称的目录的文件

时间:2017-08-30 04:03:24

标签: linux bash shell unix scripting

抱歉这个奇怪的头衔。我不知道如何以正确的方式说出来。

我正在尝试编写一个脚本来过滤我的wiki文件到那些具有相同名称和没有目录的目录。我会进一步阐述。

这是我的文件系统:

enter image description here

我需要做的是打印那些名称中包含目录的文件列表,以及另一个没有目录的文件。

所以我的最终目标是:

与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

但坚持让那些没有。如果这是错误的做法,请澄清正确的方法。

任何帮助表示赞赏。感谢。

3 个答案:

答案 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