我想处理一组文件。
pi@raspberrypi:~/A6.1 $ ls -1
0bd57df4.code
0bd57df4.enc
3189204c.code
3189204c.enc
39f831fb.code
39f831fb.enc
68ff6d19.code
68ff6d19.enc
find.sh
test.sh
我运行一个脚本 ( find.sh
),通过掩码搜索文件,然后运行另一个脚本 ( test.sh
) 并将找到的文件的名称传递给参数。
在测试模式下,我想显示完整的文件名和不带扩展名的缩写名称。
find.sh 文件的内容:
#!/bin/bash
find -name '*.enc' -printf "%f\0" | xargs -0 -n 1 ./test.sh
文件test.sh的内容:
# !/bin/bash
NAMEFILE=$1
FULLNAME=$NAMEFILE
CUTNAME=`echo ${NAMEFILE:0:6}`
echo "FULLNAME - "$FULLNAME
echo "FILENAME - $CUTNAME"
显示全名,没有缩写名。给出错误信息。如何处理变量?
pi@raspberrypi:~/A6.1 $ ./find.sh
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 68ff6d19.enc
FILENAME -
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 3189204c.enc
FILENAME -
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 39f831fb.enc
FILENAME -
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 0bd57df4.enc
FILENAME -
当我运行 test.sh 文件时,它起作用了。
pi@raspberrypi:~/A6.1 $ ./test.sh 68ff6d19.code
FULLNAME - 68ff6d19.code
CUTNAME - 68ff6d19
答案1
我有一种感觉,您也许可以通过使用 GNU Parallel 来集中您的代码:
find -name '*.enc' | parallel echo Full:{} Cut:{.}
或者如果代码更复杂:
#!/bin/bash
doit() {
FULLNAME="$1"
CUTNAME="$2"
echo "FULLNAME - $FULLNAME"
echo "FILENAME - $CUTNAME"
}
export -f doit
find -name '*.enc' | parallel doit {} {.}
答案2
该错误来自运行/bin/sh
不具有您使用的特定参数扩展的脚本。您之所以使用,是因为第一行的和/bin/sh
之间有一个空格。#
!
允许有空格后这!
:#!之间是否允许有空格和 Shebang 中的 /bin/bash ?
还相关:哪个 shell 解释器运行不带 shebang 的脚本?
您可以在这里轻松地使用单个脚本:
find . -type f -name '*.enc' -exec bash -c '
for n do
n=${n##*/}
printf "Full name:\t%s\n" "$n"
printf "Cut name:\t%s\n" "${n:0:6}"
done' sh {} +
对您提供的文件名运行此命令将产生
Full name: 0bd57df4.enc
Cut name: 0bd57d
Full name: 3189204c.enc
Cut name: 318920
Full name: 39f831fb.enc
Cut name: 39f831
Full name: 68ff6d19.enc
Cut name: 68ff6d
如果您只想删除扩展程序:
find . -type f -name '*.enc' -exec sh -c '
for n do
n=${n##*/}
printf "Full name:\t%s\n" "$n"
printf "Cut name:\t%s\n" "${n%.*}"
done' sh {} +
这产生
Full name: 0bd57df4.enc
Cut name: 0bd57df4
Full name: 3189204c.enc
Cut name: 3189204c
Full name: 39f831fb.enc
Cut name: 39f831fb
Full name: 68ff6d19.enc
Cut name: 68ff6d19