我想编写一个脚本来从一个特定的文件夹递归复制文件除文件A.extn,B/*.extn并C/*在那里B和C在目录和extn仅仅是一些通用的扩展。这就是我所拥有的:
#!/usr/local/bin/zsh
setopt EXTENDED_GLOB
TMPDIR=/tmp/test
cp -pR $(dirname $0)/**~(*.foo/*|*/bar.txt|*.abc|qux.txt) $TMPDIR
Run Code Online (Sandbox Code Playgroud)
然而,这并没有像预期的那样否定模式。我想我知道为什么——尽管模式是正确的(如 所示echo),但cp -R不知道该模式,并进入了一个“不应该”的目录,一旦进入,该模式就不再有效。
如何修改上述内容以执行我想要的操作?我想用findand是可能的xargs,但我被上面的清晰度所吸引,并且更喜欢类似的东西(但如果这是错误的方法,我会非常满意不同的解决方案)。
我想比较两个文件以检查它们之间的差异,fileA 和 fileB。fileA 就像一个模板文件,fileB 是我想与之比较的文件。每当我发现差异时,我都想将该差异输出到 fileC。
困难在于 fileA 和 fileB 包含某些(不是全部)行,这些行具有一些总是不同的数据 - 时间、日期和随机生成的 id 代码。但是,我不想将行输出到 fileC,其中唯一的区别是时间、日期和 ID 代码。
所以我想要做的是从它们出现在 fileB 中的任何行中删除时间、日期和 id 代码(我可以在 fileA 中手动执行此操作),然后与 fileB 进行比较,将不同的行输出到 fileC。
请注意,要删除的文本始终遵循特定模式。所以我可以使用带有这些模式的 grep 找到文本,但我不知道如何删除它...
这是两个文件的示例,以显示我的意思:
文件B
qaqa rara
abc 10:12:25 08/20/2014 123456 def
ghi fff ddd
jkl 09:20:40 08/20/2014 978645 dfdf gggg
Run Code Online (Sandbox Code Playgroud)文件A
qaqa rara
abc 10:32:15 07/15/2014 121456 xxx
ghi eee ddd
jkl 10:01:22 07/15/2014 971645 dfdf gggg
Run Code Online (Sandbox Code Playgroud)我想找出上述两个文件之间的差异,不考虑时间(例如 10:12:25)、日期(例如 08/20/2014)或 ID 代码(例如 123456)并将差异输出到 fileC
这两行不同,因此是第 2 行和第 3 行。第 1 行对于这两个文件是相同的。删除时间、日期和 …
我需要识别文本文件中的模式以进行进一步分析。因此输入文件可能包含如下半结构化文本;
文件 1
905:john: abc123: john@doe.com: US
920:eric: ericaA: eric007@gmail.com: US
1000: rio: ri0ri0: rio@yahoo.com: IN
Run Code Online (Sandbox Code Playgroud)
文件 2
nathen <tab> nathen@yman.com <tab> 764323545 <tab> UK
thomas <tab> thom@gmail.com <tab> 563363421 <tab> UK
ian <tab> rt@gmail.com <tab> 3453245472 <tab> SP
Run Code Online (Sandbox Code Playgroud)
每个文档的一行中的单词数可能会有所不同。分隔符也各不相同,但每个文档都是唯一的。我想要的是计算每个文档中每行的字数。
输出将是:
对于文件 1
5
5
5
5
Run Code Online (Sandbox Code Playgroud)
对于文件 2
4
4
4
4
Run Code Online (Sandbox Code Playgroud)
我想对带有任何分隔符的任何文件进行概括。可能是- | : \space+ \tab+。
部分文件如下:
| hetro@gmail.com | er34532 |
| rt@gmail.com | 764474 |
Run Code Online (Sandbox Code Playgroud) 我有一个包含表单 URL 列表的文件
编辑
http://www.google.com/absd/siidfs/kfd837382 $%^$&,
www.google.com,
google.com
yahoo.com/list/page/jhfjkshdjf...
我想编写一个脚本来显示以下输出
google.com : 2
http://www.google.com: 1
yahoo.com : 1
Run Code Online (Sandbox Code Playgroud)
我被困在我必须从文件中读取 URL 并再次检查整个文件的部分。我是 bash 脚本的新手,因此我不知道该怎么做。
这些是目录中的文件:
Ford-Mustang-001.jpg
Ford-Mustang-002.jpg
Ford-Mustang-003.jpg
Chevy-Impala-001.jpg
Chevy-Impala-002.jpg
Chevy-Impala-003.jpg
Run Code Online (Sandbox Code Playgroud)
我想将这些分类到子文件夹中:
/Mustang
/Impala
Run Code Online (Sandbox Code Playgroud) 这是给定的文件集:
./20170524/18909-20170524182010-PBS74C2VTTCKBMKGQC7YUVEJ3U-362511-19614379.XFA.SOFS_EDI
./20170524/18909-20170524182009-PBS74C2VTTCKBMKGQC7YUVEJ3U-362514-19614381.XFA.SOFS_EDI
./20170524/18909-20170524182010-PBS74C2VTTCKBMKGQC7YUVEJ3U-362532-19614390.XFA.SOFS_EDI
./20170524/18909-20170524182009-PBS74C2VTTCKBMKGQC7YUVEJ3U-362503-19614371.XFA.SOFS_EDI
./20170524/18909-20170524182009-PBS74C2VTTCKBMKGQC7YUVEJ3U-362506-19614372.XFA.SOFS_EDI
Run Code Online (Sandbox Code Playgroud)
这是每个文件中的内容。他们有不同的AK9细分市场。像AK9*A、AK9*P、AK9*R或AK9*E。
ISA*00* *00* *SS*252649841464SS *01*12564486M *102453*1254*U*025402*21651681320*0*S*>~SS*SS*5648408456SS*0150158011S*20170228*1921*020151018*X*0210540~SS*997*008609070~AK1*SH*107405~AK2*856*362518~AK5*A~AK9*A*1*1*1~SE*6*008609070~GE*1*008604488~IEA*1*008602662~
Run Code Online (Sandbox Code Playgroud)
我正在寻找具有这种模式的文件:
AK9*P或AK9*R或AK9*E
我的任务是编写一个 shell 脚本来检查文件名是否符合特定模式,但我不知道如何去做。
文件名应遵循如下所示的模式:
(Project-ID)_(Env)_(Source-System-ID)_(DataDescriptor)_(CCYYMMDD)_(Seq)_(Freeformat)_(codepage)
Run Code Online (Sandbox Code Playgroud)
示例文件可能如下所示:
ABC_PRD_00227_ACC_20130128_01_LTSB.CP1252
Run Code Online (Sandbox Code Playgroud)
如果文件不符合模式,最好能显示某种警告。
这是一个关于最佳实践的简单问题:我应该使用哪个?
选项1
ping -c1 "$host"
if [[ $? -eq 0 ]] ; then
command
else
command
fi
Run Code Online (Sandbox Code Playgroud)
选项 2
if ping -c1 "$host" ; then
command
else
command
fi
Run Code Online (Sandbox Code Playgroud)
我知道这是一个简单的命令,但如果它变大,差异可能会很大。
这有效:
$ touch abcdefg
$ mv -v abcdefg abc[de]fg
‘abcdefg’ -> ‘abc[de]fg’
Run Code Online (Sandbox Code Playgroud)
但这不起作用:
$ touch abcdefg
$ mv -v abcdefg abc[d]efg
mv: ‘abcdefg’ and ‘abcdefg’ are the same file
Run Code Online (Sandbox Code Playgroud)
为什么?
我正在尝试按照 Bash Cookbook 来了解 Bash Scripting。我正在使用正则表达式进行示例 6.8 测试。
我有以下脚本:
#!/usr/bin/env bash
# cookbook filename: trackmatch
for CDTRACK in *
do
if [[ "$CDTRACK" =~ "([[:alpha:][:blank:]]*)- ([[:digit:]]*) - (.*)$" ]]
then
echo ${BASH_REMATCH[2]}
else
echo Error $CDTRACK
fi
done
Run Code Online (Sandbox Code Playgroud)
我将此应用于我目录中的几个文件:
Ludwig van Beethovern - 02 - Adagio un poco mosso.ogg
路德维希·范·贝多芬 - 01 - Allegro.ogg
我总是得到一个错误返回。问题似乎与([[:alpha:][:blank:]]*)- ([[:digit:]]*) -代码部分有关。当我确实有 if 语句时:if [[ "$CDTRACK" =~ "(.*)$" ]]那么就没有错误。
关于我做错了什么的任何想法?
我在 AWS,Bash v 4.2 上运行代码
我想找到所有以“~”或“pyc”结尾的文件(在当前目录和所有子目录中)。为此,我尝试了以下find模式:
find . -name '*{~,pyc}'
find . -name '{*~,*.pyc}'
Run Code Online (Sandbox Code Playgroud)
但都没有列出目录中存在的任何文件。为什么这些模式不起作用?怎么做才对?
当使用ls而不是find(不带引号)时,我得到了预期的结果(除了ls只显示当前目录而不是所有子目录)。