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
在命令末尾,以抑制错误消息