我正在尝试在包含文件夹的目录中进行简单的重复操作,例如在每个文件夹中复制/粘贴或重命名文件。我的问题是,通过使用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不是文件夹,无法访问”
感谢您的宝贵帮助
答案 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是扩展的正则表达式