如何仅列出“普通”可读文件夹(例如未列出压缩文件夹)?

时间:2019-07-05 22:10:58

标签: bash

我正在尝试在包含文件夹的目录中进行简单的重复操作,例如在每个文件夹中复制/粘贴或重命名文件。我的问题是,通过使用ls -d命令,它不仅考虑了“普通文件夹”,还考虑了.tar.bz2。这会导致我在文件夹中进行操作的问题。

我尝试使用限制参数(例如大小或特定字符的存在)以不同的方式列出这些文件夹,但是我的目录包含成千上万个名称和名称大小完全不同的文件夹...然后是“特殊”解决方案没什么用,除了我需要的一些文件夹。

for i in $(ls -d 2015*)
   do 
     cp -v file_Iwant_2_Copy "Place_2_copyIt_$i"
     cd ../
done 

我需要的是在变量i中,仅列出未压缩的文件夹。使用ls -d时,会考虑使用.bz2,当我尝试“输入”后会导致错误,例如:

  

“ XXX.bz2不是文件夹,无法访问”

感谢您的宝贵帮助

2 个答案:

答案 0 :(得分:3)

测试该目录是否为if [ -d "$i" ]

for i in 2015*
do 
    if [ -d "$i" ]
    then
        cp -v file_Iwant_2_Copy "Place_2_copyIt_$i"
    fi
done 

没有理由使用ls -d,只需直接使用通配符即可。参见Why not parse ls (and what do to instead)?

并且您不应在循环中使用cd ..。如果文件在第一次迭代的当前目录中,那么它将不在父目录中。然后,每次迭代将上移一个级别,从文件所在位置开始进一步移动。

答案 1 :(得分:0)

这是一种方法:

for i in $(ls -1 | grep -ivE "2015.*\.(tar|bz2)$"); do 
    echo "copying $i"
    cp "$i" "${i}_mod" 
done

grep标记含义:

-i不区分大小写

-v选择不匹配的行

-E PATTERN是扩展的正则表达式