Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 提取不包含';我没有同名的目录_Linux_Bash_Shell_Unix_Scripting - Fatal编程技术网

Linux 提取不包含';我没有同名的目录

Linux 提取不包含';我没有同名的目录,linux,bash,shell,unix,scripting,Linux,Bash,Shell,Unix,Scripting,对不起,这个奇怪的标题。我不知道如何用正确的方式来表达它 我正在尝试编写一个脚本,将我的wiki文件过滤到那些有相同名称的目录和没有相同名称的目录。我将进一步阐述 这是我的文件系统: 我需要做的是打印一个列表,列出那些名称中有目录的文件和另一个没有目录的文件 因此,我的最终目标是: 使用目录: Docs Eng Python RHEL To_do_list articals 无直接记录: orphan.txt orphan2.txt orphan3.txt 我设法用dirs得到了那些文件。

对不起,这个奇怪的标题。我不知道如何用正确的方式来表达它

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

这是我的文件系统:

我需要做的是打印一个列表,列出那些名称中有目录的文件和另一个没有目录的文件

因此,我的最终目标是:

使用目录:

Docs
Eng
Python
RHEL
To_do_list
articals
无直接记录:

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
但我坚持不买。如果这是错误的做法,请澄清正确的做法


谢谢你的帮助。谢谢。

这可能不是最有效的方法,但您可以获取所有文件,删除扩展名,并检查是否有同名目录

如下所示(未经测试的代码):


列出当前目录中的所有文件

list1=`ls -p | grep -v /`
list3=`ls -d */ | sed -e "s/\///g"`

列出当前目录中不带扩展名的所有文件

list2=`ls -p | grep -v / | sed 's/\.[a-z]*//g'`
列出当前目录中的所有目录

list1=`ls -p | grep -v /`
list3=`ls -d */ | sed -e "s/\///g"`

现在,您可以使用list2和list3的交集获得所需的目录列表

这里有一个快速尝试

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对标记的值进行空格标记化和通配符扩展,否则所有内容都需要引用

这里的代码示例都不起作用,更不用说做文章中所说的了。
list1=ls-p
意味着在尝试执行无效命令时将值
ls
分配给
list1
。我猜您可能正在寻找一个命令替换
list1=($(ls-p | grep-v/)
,但您应该是命令替换。刚刚更新了我的ans。我想,某种程度上,格式化会让你感到困惑。基本上是将命令的输出存储在列表中。对于带有空格或shell元字符的文件名,这仍然不够健壮。将
ls
的输出读入数组名义上可以解决这个问题,但实际上,这就是为什么我们有
printf“%q”
。因此
all=($(printf“%q”*)
将所有文件名放在一个数组中,而
dirs=($(printf“%q”*/)
将所有目录放在另一个数组中。现在开始了解如何做。所有的变量插值都需要用双引号括起来,这样才能对包含空格或shell元字符的文件名有效。您能解释一下这一行吗请
test-d“${file%.txt}”和&printf”%s\n“$nodir”>&3 | | printf”%s\n“$nodir”
。我还把它转换了,因为除了保存它,我还想制作其他东西。谢谢你,伙计,我真的很感谢你的帮助。为了记录在案,
a&&b|c
是一个布尔短路,如果a;然后b;其他c;fi