有没有办法搜索git存储库,git grep但从搜索中排除某些路径/目录/文件?像--exclude普通grep命令中的选项一样.
如果你很好奇:我不想使用普通的grep,因为它比git grepgit存储库的大小要慢得多.
我刚刚在这里找到了关于bash extglob shell选项: - 在unix/linux shell中进行模式匹配时如何使用反向或负向通配符?
所使用的所有答案shopt -s extglob也提到shopt -u extglob将其关闭.我为什么要把这么有用的东西转过来?确实,为什么不默认开启?据推测,它有可能带来一些令人讨厌的惊喜.这些是什么?
Using the pattern match !("file1") does not work within a bash script but will work on the command line.
For example:
ls !("file1"|"file2")
Run Code Online (Sandbox Code Playgroud)
This will list all files in directory except file1 and file2.
When that line is executed in a script this error is displayed:
./script.sh: line 1: syntax error near unexpected token `('
./script.sh: line 1: ` ls !("file1"|"file2") '
Run Code Online (Sandbox Code Playgroud)
Regardless what is used rm -v !("file1"). The same error takes place. What is going on …
我已经阅读了该man页面ls,我找不到列出所有与文件选择器不匹配的选项.你知道怎么做这个操作吗?
例如:假设我的目录是这样的:
> ls
a.txt b.mkv c.txt d.mp3 e.flv
Run Code Online (Sandbox Code Playgroud)
现在我想做一些能做到以下事情的事情
> ls -[SOME_OPTION] *.txt
b.mkv d.mp3 e.flv
Run Code Online (Sandbox Code Playgroud)
有这样的选择吗?
如果没有,有没有办法将输出管道输出ls到另一个功能(可能sed),只显示我想要的功能?
我不知道该怎么做,但我想它会是这样的:
> ls | sed [SOMETHING]
Run Code Online (Sandbox Code Playgroud)
我真的应该学习如何使用sed,awk和grep,但我一直在坚持理解如何编写正则表达式.我清楚地理解正则表达式的概念,但我对使用不同语法的正则表达式感到困惑.
任何帮助将非常感激!
编辑:
我忘了提,我正在运行的Mac OS X,这样的功能可以是在其他的答案为UNIX/Linux外壳讨论的略有不同(因此我的一些困惑与sed,awk和grep).
我想fubar.log从shell(bash)globbing字符串中删除特定的文件名(例如)*.log.我尝试过的任何东西似乎都不起作用,因为globbing不使用标准RE集.
测试用例:目录包含
fubar.log
fubaz.log
barbaz.log
text.txt
Run Code Online (Sandbox Code Playgroud)
并且只能fubaz.log barbaz.log通过glob扩展.
我正在编写一个脚本,需要从目录中删除所有内容,除了两个目录,mysql和temp.
我试过这个:
ls * | grep -v mysql | grep -v temp | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)
但这也保留了所有名称中包含mysql的文件,我不需要.它也不会删除任何其他目录.
有任何想法吗?
我正在使用git提交修剪空白git diff-index --check --cached HEAD --.我想使用快照添加Jest测试,但快照文件包含空格,如果删除它,我的测试将始终失败.所以我想*.js.snap从空白检查中排除文件.如何告诉git从中排除*.js.snap(或替代**/__snapshots/*)文件git diff-index?我在OSX上使用bash.
与此同时,我正在通过将提交挂钩更改为交互式来解决此问题:
# If there are whitespace errors, print the offending file names and fail.
git diff-index --check --cached HEAD --
if [ $? -ne 0 ]; then
# Allows us to read user input below, assigns stdin to keyboard
exec < /dev/tty
while true; do
echo "Your commit introduces trailing whitespace. Are you sure you want to commit? y/n"
read yn
case $yn …Run Code Online (Sandbox Code Playgroud) 我不得不使用包含数十万个文件的目录,进行文本匹配,替换等等.如果我走标准路线,比如说
grep foo *
Run Code Online (Sandbox Code Playgroud)
我收到太多文件错误消息,所以我最终做了
for i in *; do grep foo $i; done
Run Code Online (Sandbox Code Playgroud)
要么
find ../path/ | xargs -I{} grep foo "{}"
Run Code Online (Sandbox Code Playgroud)
但这些并不是最优的(为每个文件创建一个新的grep进程).
这看起来更像是程序可以接收的参数大小的限制,因为for循环中的*可以正常工作.但是,无论如何,处理这个问题的正确方法是什么?
PS:不要告诉我做grep -r,我知道,我正在考虑没有递归选项的工具.
我尝试使用以下命令:
cp src_folder/[!String]* dest_folder
Run Code Online (Sandbox Code Playgroud)
但是,此命令将复制所有不以任何字符'S','t','r','i','n','g'开头的文件,而不是复制不复制的文件以"String"开头.
有没有办法处理invers bash v4 shell扩展,即.处理所有文件不像通配符?我需要在这种情况下rm不是格式的所有文件,'Folder-???'并且想知道是否有更短的(即内置)方式然后做一个
for file in *
do
[[ $i =~ \Folder-...\ ]] && rm '$i'
done
Run Code Online (Sandbox Code Playgroud)
环.(这个例子不起作用,顺便说一下......)
刚出来的bash学习好奇心......