我有一个名为except.sh的bash脚本,它被传递了一个文件/目录列表,如下所示:
$ ls
a b c d/
$ ./except.sh b c
除这种方式外,当调用时,它应该扩展到a d/,即除给定名称之外的所有文件/目录。
下面是我如何尝试实现这一点:
#!/usr/bin/env bash
# enable extended globbing
shopt -s extglob
# set IFS to | so that $* expands correctly
IFS='|'
printf '%s' !("$*")
给定b c
我需要创建一个BASH条件,以检查是否发现了任何不寻常的字符。如果没有任何字符,则条件返回true:c、d、f、g、h、T、,、?、!。例如:
if [[ "$variable" contains something that is not [cdfghZ,?!] ]]
then
echo "The variable contains an unknown character."
fi
如何检查在带有BASH条件的列表中找不到的字符?
我有一个名为temp的目录。在这个文件夹中,我有多个子文件夹(我不知道确切的数量)。现在,我在temp中创建了另一个名为Untitled的子文件夹。现在,我想移动Untitled中的所有其他子文件夹。
假设我在临时目录中有3个文件夹,名为a,b,c,现在我创建了Untitled。所以temp现在包含4个文件夹a,b,c和Untitled。执行操作后,temp将只包含包含a,b,c的无题文件夹。
如何使用bash实现这一目标?
我的Bash版本(在Ubuntu 16.04上)
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
我有一些bash脚本,它们在甲骨文中做一些DML。我想捕捉日志文件中的Oracle (只有ORA-XXXXX部分),但是除了Oracle消息之外,在输出中,我得到了执行bash脚本的目录内容(就像执行ls命令一样)。是否有一种干净的方法可以获得唯一的Oracle错误代码和静默/重定向目录内容?
#!/bin/bash
. /path/to/configfile/config.conf
res=`sqlplus -S $my_user << !
set head off;
set feedback off;
select * from give_me_e
我正在进行一个scp调用,以下载远程系统上的文件夹。下载的文件夹有子文件夹,在这些子文件夹中有一堆文件,我想将这些文件作为参数传递给python脚本,如下所示:
scp -r researcher@192.168.150.4:SomeName/SomeNameElse/$folder_name/ $folder_name/
echo "File downloaded successfully"
echo "Running BD scanner"
for d in $folder_name/*; do
if [[ -d $d ]]; then
在某些脚本中,我希望使用当前文件夹中文件夹的名称。我想得到文件夹名,我只会把有问题的部分放在这里的一个例子中。如果我从终点站运行这个,我会得到:
$ for D in */; do echo ${D%%+(/)} ; done
galaxya8
iphone6s
motog6
motog7
$ echo ${0}
/bin/bash
$ bash --version
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
但是,如果将其放入文件并运行该文件,则会得到带有尾斜杠的名称:
$ echo 'for D in */
我绝对需要练习我的脚本..。到目前为止,我有了下面的脚本,当将一个.zip和一个平面文件放入源位置时,该脚本可以工作。如果多个文件被放入其中,它就不能正确执行,我希望看看是否有人能以一种更有效的方式提供帮助。为了澄清脚本需要扫描源文件夹中的任何.zip文件,将它们解压缩到同名文件夹(减去.zip ),然后将新文件夹连同源文件中的任何其他平面文件或非.zip文件一起移动到另一个位置,并删除原始的.zip文件。
#! /bin/bash
cd "/path/to/source/Location"
for file in $(ls *.zip); do unzip $file -d
代码如下,我想检查一些文件大小小于410Bytes的文件:
for file in *; do
if [[ "$file" =~ ^dataset([0-9]+)$ && `du -b $file/${BASH_REMATCH[1]}_conserv.png` -lt 410 ]]; then
cd $file
$some_commands
cd ..
fi
done
但是,当我运行这个脚本时,它会像这样报错:
less_than_410.bash: line 2: [[: 13605 dataset4866/4866
我用Bash编写了以下函数:
function findTest {
files=`ls $1`
for file in ${files[*]}; do
if [[ "$file"=="*.tst" ]]; then
grep "version: $2" $1/$file
if [[ $? -eq 0 ]]; then
echo -n $2
grep "result" | cut -d ":" -f2
fi
我必须在脚本中执行case语句,其中参数可以写为DIRECTORYNAME或PATH/DIRECTORYNAME。因此,基本上是在当前目录或用户指定的路径中创建一个目录。我正在考虑做一些事情,比如检查参数中是否有"/“,以了解它是否是路径,但我不知道在case语句中编码这个想法。case语句必须按此顺序执行。 #!/bin/bash
case $1 in #no argument
"") mkdir project
;;
no "/") #don't know how to code it
mkdir $1
;;
*)#for when a
我在一个目录中有一堆文件。每个文件的基本名称都以两位数字和字母结尾,例如file_01A.txt、file_03B.txt、file_13A.txt。 在使用bash (我假设是在mac上工作)的终端中,我使用 ls *01*[AB]*.txt 返回所有文件,如01A和01B。这对我来说是有意义的。 ls *02*[AB]*.txt 以类似方式返回所有文件,如02A和02B。 现在我想返回所有文件01A,01B,02A,02B。因此,我想要这样的东西: ls *(01 or 02)*[AB]*.txt 尝试1:我尝试使用|,但是抛出了一个错误。 尝试2:ls *[01,02]*[AB]*.t
我想编写一个bash脚本来检查输入消息是否采用以下格式。“类别:解释”。只有当类别是bash、java、python中的一个时,它才会返回成功。Bash不是我的语言,所以请原谅我这个丑陋的代码。 #!/bin/sh
input=$1
if[["$input"==bash:*]]
then exit 0
fi
if[["$input"==java:*]]
then exit 0
fi
if[["$input"==python:*]]
then exit 0
fi
echo "categories are python, bash,
我有一个与逗号分隔的值类似的变量,需要循环,我使用下面的代码
Var=test_v1,"Log Processor",test_v2
for i in ${Var//,/ }
do
echo "Variables are "${i}" assined"
done
输出:
Variables are test_v1 assined
Variables are Log assined
Variables are Processor assined
它不以整字双引号作为单引号输出,它给我的日志和处理器是不同的,但它的单一价值。
我试图在shell脚本中执行以下命令,其中adir="mydir"和extType=*.txt
cp "$adir/$extType" "$destination"
不过,我明白了:
cp: cannot stat ‘mydir/*.txt’: No such file or directory
但是有这样的目录,如果我在命令行中手动执行它,它就能工作。
有什么好主意吗?
我的意思是使用rsync删除某些文件(对于高效删除包含数千个文件的大目录),在这种情况下,作为命令行中的模式提供给shell脚本。
到目前为止,这是我的shell脚本rsync_del.sh中的内容
#!/bin/bash
TARGET_DIR=${1}
shift
PATTERNS="${@}"
for patt in ${PATTERNS} ; do
# Both do the same
#INCLUDE_PATTERNS="${INCLUDE_PATTERNS}"' --include='\'"${patt