我有一组数字文件名的文件列表(例如 #.php,##.php 或 ###.php),希望能够一次性地拷贝/移动。
有没有人知道一个可以实现这个目标的 ls
或者 grep
组合命令?
我已经有了这些内容:
ls -al | grep "[0-9].php"
shopt -s extglob
ls -l +([0-9]).php
这将会找到类似以下的文件:
123.php
9.php
但不是
a.php
2b.php
c3.php
ls -al | grep -E '^[0-9]+\.php$'
-E
激活扩展正则表达式。
+
要求前面的组至少出现一次。
\.
转义点号,否则它表示 "任何字符"。
^
和 $
匹配整个文件名而不是部分。
单引号用于防止变量扩展(因为有 $
会出错)。
使用find:
$ find . -regex '^[0-9]+\.php' -exec mv '{}' dest/ ';'
-regex
参数执行的是搜索而不是匹配,这就是为什么需要使用^锚定到开头。此外,假设文件与运行该命令时所在的目录(.)相同。
mv
命令中的{}
技巧被find
替换为找到的文件名。find . -regex '^[0-9]+\.php' -exec mv '{}' dest/ ';'
或xargs -0
。 - Philipp^[0-9]+\.php$
,那么你的原始代码当然不会出问题。然而,我猜很多读者会盲目地修改你的代码以包含其他模式,这可能会导致问题。 - Philipp要么使用find
命令(可能与-XXXdepth
选项组合使用):
find . -mindepth 1 -maxdepth 1 -regex '^[0-9]+\.php' -exec mv '{}' dest/ ';'
或者使用内置的正则表达式功能:
pattern='^[0-9]+\.php$'
for file in *.php
do
[[ $file =~ $pattern ]] && echo "$file"
done
不要使用ls
或grep
命令。
以下内容在我的情况下有效:
ls -an
bash
不会将其视为正则表达式。试一下,你会发现它匹配以数字开头的任何文件名。 - Troubadour0a.txt
这样的文件的目录中测试它。 - Philipp
ls
命令,它只适用于交互式使用。 - Philippgrep
中使其成为“脚本”。 - Dennis Williamsonls
,它仅用于交互式使用。请参见ParsingLs。” - Dennis Williamson