Bash 检查文件名中是否包含字符串
我在创建Bash 检查文件名中是否包含字符串,bash,shell,Bash,Shell,我在创建if语句来检查目录中的文件名称中的某个字符串时遇到问题 例如,我在某个目录中有以下文件: file_1_ok.txt file_2_ok.txt file_3_ok.txt file_4_ok.txt other_file_1_ok.py other_file_2_ok.py other_file_3_ok.py other_file_4_ok.py another_file_1_not_ok.sh another_file_2_not_ok.sh another_file_3_not_
if
语句来检查目录中的文件名称中的某个字符串时遇到问题
例如,我在某个目录中有以下文件:
file_1_ok.txt
file_2_ok.txt
file_3_ok.txt
file_4_ok.txt
other_file_1_ok.py
other_file_2_ok.py
other_file_3_ok.py
other_file_4_ok.py
another_file_1_not_ok.sh
another_file_2_not_ok.sh
another_file_3_not_ok.sh
another_file_4_not_ok.sh
#!/bin/bash
directory1=/FILES/user/directory1/
directory2=/FILES/user/directory2/
string="1_ok"
cd $directory
for every file in $directory1
do
if [$string = $file]; then
cp $file $directory2
fi
done
我想将包含1\u ok
的所有文件复制到另一个目录:
file_1_ok.txt
file_2_ok.txt
file_3_ok.txt
file_4_ok.txt
other_file_1_ok.py
other_file_2_ok.py
other_file_3_ok.py
other_file_4_ok.py
another_file_1_not_ok.sh
another_file_2_not_ok.sh
another_file_3_not_ok.sh
another_file_4_not_ok.sh
#!/bin/bash
directory1=/FILES/user/directory1/
directory2=/FILES/user/directory2/
string="1_ok"
cd $directory
for every file in $directory1
do
if [$string = $file]; then
cp $file $directory2
fi
done
更新:
更简单的答案是,但如果要删除或只是移动没有所需特定字符串的文件,请参阅
其他答案也是有效的。使用
find
:
find directory1 -maxdepth 1 -name '*1_ok*' -exec cp -v {} directory2 \;
与相比,使用find
的优势在于,它可以处理无限数量的包含1_ok
的文件,如果glob解决方案在调用参数过多的cp
时会导致参数列表过长
错误
结论:对于有限数量的输入文件的交互式使用,glob将很好,对于必须稳定的shell脚本,我将在脚本中使用
find
,我建议:
cp directory1/*1_ok* directory2/
#!/bin/bash
source="/FILES/user/directory1"
target="/FILES/user/directory2"
regex="1_ok"
for file in "$source"/*; do
if [[ $file =~ $regex ]]; then
cp -v "$file" "$target"
fi
done
从
帮助[[
:
使用=~
运算符时,运算符右侧的字符串
作为正则表达式匹配
请查看:使用
extglob
在bash
中匹配以下模式
+(图案列表)
匹配给定模式的一个或多个实例
首先通过以下方式启用extglob
shopt -s extglob
cp -v directory1/+(*not_ok*) directory2/
例如,
$ ls *.sh
another_file_1_not_ok.sh another_file_3_not_ok.sh
another_file_2_not_ok.sh another_file_4_nnoot_ok.sh
$ shopt -s extglob
$ cp -v +(*not_ok*) somedir/
another_file_1_not_ok.sh -> somelib/another_file_1_not_ok.sh
another_file_2_not_ok.sh -> somelib/another_file_2_not_ok.sh
another_file_3_not_ok.sh -> somelib/another_file_3_not_ok.sh
要删除除包含此模式的文件之外的其他文件,请执行以下操作
$ rm -v !(*not_ok*) 2>/dev/null
甚至比查找更简单+1@hex2mgl
find
如果有太多匹配的文件无法放在一个命令行中,则很有用;您应该取消删除您的答案。我还有另外一个问题,如果我想从目录中删除除包含“1\u ok”之外的所有文件,该怎么办字符串?@Otorrinolaringologista-man:参考我的更新,最后启用了ext glob
,用于删除选项。@Otorrinolaringologista-man:或者您可以使用:find.-maxdepth 1-键入f!-name“*1_ok*”-删除
感谢更新,但是rm是否会从系统中完全删除文件?我的意思是说,我想要所有没有“1_ok”的文件字符串将被发送到另一个目录。以防万一有一天我也会使用它。@otorinolaringologista man:那你为什么建议删除,rm
将从文件系统中完全删除该字符串。尝试使用mv
我输入时没有考虑清楚。多谢了,伙计。我将更新主要帖子。我还有一个问题。Wh恩,我尝试使用mv命令,它可以很好地移动文件,但是当我尝试将文件从文件夹移动到子文件夹时,出现错误消息说它无法将文件夹移动到自身中,即使它可以很好地移动所有其他文件。有没有办法避免出现该错误?@Otorrinolaringologista man,添加一个2>/dev/null
在命令末尾,以抑制错误消息