Arrays 在bash中使用数组并执行其他操作

Arrays 在bash中使用数组并执行其他操作,arrays,bash,awk,Arrays,Bash,Awk,我正在写一个bash脚本,需要帮助。这就是我所尝试的: 借助@merlin2011 #!/bin/bash if [ $# -ne 2 ]; then echo "Usage: `basename $0` <absolute-path> <number>" exit 1 fi if [ "$(id -u)" != "0" ]; then echo "This script m

我正在写一个bash脚本,需要帮助。这就是我所尝试的:

借助@merlin2011

#!/bin/bash

if [ $# -ne 2 ]; then
    echo "Usage: `basename $0` <absolute-path> <number>"
    exit 1
fi

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

#find . -name "$2" -exec mv {} /some/path/here \;
find $1 >> /tmp/test
for line in $(cat `/tmp/test`); do
    echo $line | mv $2 awk -F"/" '{for (i = 1; i < NF; i++) if ($i == "$2") print $(i-1)}'
done
然后我想将
2010
重命名为父目录
。我的模式是:

arr[1]="/path/to/2010/file.db"
arr[2]="/path/test/2010/fileee.db"
arr[3]="/path/tt/2010/fileeeee.db"
.
.
.
arr[100]="/path/last/2010/fileeeeeee.db"
结果应该是:

mv /path/to/2010/ to
mv /path/test/2010 test
mv /path/tt/2010/ tt
.
.
.
mv /path/last/2010 last
更新:

总的来说,我想知道如何在
awk
中反向获得一个变量

/path/to/dir1/2010/file.db
我想在
绝对路径
中搜索,然后找到2010并在前面的路径中使用
/
模式将其重命名,如:awk-F/{print[what?]}

告诉awk我的状态是2010,然后在知道拆分器是
/

更新 文件dirs和subdirs模式为:

/path/to/file/efsef/2010/1.db
/path/to/file/hfjh/sdfsf/2010/2.db
/path/to/file/dsf/sdhher/aqwe/sfrt/2010/3.db
.
.
.
/path/to/file/kldf/2010/100.db
我想将所有2010年的目录重命名为它们的父目录,然后
tar
all
.db

这正是我想要的:)

要实现,我们必须执行递归文件夹搜索。
它应该是find和mv两个命令的组合
找到-名称“2010”-exec mv{}/some/path/here\;
merlin2011分享的其他方式
mv$2 awk-F“/”{for(i=1;i
要实现,我们必须执行递归文件夹搜索。
它应该是find和mv两个命令的组合
找到-名称“2010”-exec mv{}/some/path/here\;
merlin2011分享的其他方式
mv$2 awk-F“/”{for(i=1;i
此答案仅针对OP的更新。我最好的解释是,您试图让
awk
打印字符串
/path/to/dir1/2010/file.db
中的值
dir1
。下面这一行将实现它

awk -F"/" '{for (i = 1; i < NF; i++) if ($i == "2010") print $(i-1)}'
根据您的更新,您应该使用
backtic
操作符围绕
awk
命令

mv $2 `awk -F"/" '{for (i = 1; i < NF; i++) if ($i == "$2") print $(i-1)}'`
mv$2`awk-F”/“{for(i=1;i
此答案仅针对OP的更新。我最好的解释是,您试图让
awk
打印字符串
/path/to/dir1/2010/file.db
中的值
dir1
。下面这一行将实现它

awk -F"/" '{for (i = 1; i < NF; i++) if ($i == "2010") print $(i-1)}'
根据您的更新,您应该使用
backtic
操作符围绕
awk
命令

mv $2 `awk -F"/" '{for (i = 1; i < NF; i++) if ($i == "$2") print $(i-1)}'`
mv$2`awk-F”/“{for(i=1;i
以下是awk命令:

awk -F"/$2/" '{split($1, a, "/"); system("echo mv " $0 " " a[length(a)]);}' <<< "$1"
mv /path/to/dir1/2010/file.db dir1
awk-F/$2/'{split($1,a,“/”);system(“echo mv“$0”a[length(a)];}'以下是awk命令:

awk -F"/$2/" '{split($1, a, "/"); system("echo mv " $0 " " a[length(a)]);}' <<< "$1"
mv /path/to/dir1/2010/file.db dir1


awk-F/$2/“{split($1,a,“/”);system(“echo mv“$0”a[length(a)];}”这应该是:
find$1-name“$2”-exec mv{}[这里应该是2010年的父目录]\
Ok…我想用awk来查找父目录…我不擅长
awk
这应该是:
find$1-name“$2”-exec mv{}[这里应该是2010年的父目录]\好的…我想使用awk查找父目录…我不擅长
awk
谢谢..非常好..但是:如何告诉重命名2010到awk的结果在这里?我将根据您的数组是正确的假设进行更新。我喜欢您的解决方案。莫特扎尔斯克,用我更新答案中的最后一行。请记住,我假设
echo$line
中始终有一个
2010
。如果这不是真的,那么
mv
命令将简单地抛出并出错,因为它只有一个参数。谢谢..非常好..但是:如何在这里告诉rename 2010与awk的结果?我将根据您的数组是正确的假设进行更新。我喜欢您的解决方案。莫特扎尔斯克,用我更新答案中的最后一行。请记住,我假设
echo$line
中始终有一个
2010
。如果这不是真的,那么
mv
命令将简单地抛出并出错,因为它只有一个参数。请告诉我这是否符合您的要求。您想将
/path/to/dir1/2010/file.db
传递给awk并搜索
2010
?如果找到了
2010
,那么您下一步要做什么?谢谢。。。如果找到2010[second argument],我想将其重命名为父目录……那么您想:
mv/path/to/dir1/2010/file.db dir1
?我想做:mv$2[parent directory of$2]我刚刚更新过。请告诉我这是否符合您的要求。您想将
/path/to/dir1/2010/file.db
传递给awk并搜索
2010
?如果找到了
2010
,那么您下一步要做什么?谢谢。。。如果找到2010[second argument],我想将其重命名为父目录……那么您想:
mv/path/to/dir1/2010/file.db dir1
?我想做:mv$2[parent directory of$2]请检查它是怎么做的。您可以设置
s=“$2”
。是不是
dir1
2010
的父目录?是的,但这是一个变量本身…可能是dir1,也可能是其他任何东西…因此命令
mv/path/to/dir1/2010/file.db dir1
我认为不应该起作用是的,它可以是任何东西。在上面的命令中,如果
s='/path/to/anything/2010/file.db'
那么输出将是:
mv/path/to/anything/2010/file.db anything
您还期望什么?好的……您可以把整个脚本放进去吗?我不能写它,因为有些问题…非常感谢你请检查它的功能。您可以设置
s=“$2”
。是不是
dir1
2010
的父目录?是的,但这是一个变量本身…可能是dir1,也可能是其他任何东西…因此命令
mv/path/to/dir1/2010/file.db dir1
我认为不应该起作用是的,它可以是任何东西。在上面的命令中,如果
s='/path/to/anything/2010/file.db'
那么输出将是:
mv/path/to/anything/2010/file.db anything
您还期望什么?好的……您可以把整个脚本放进去吗?因为一些问题,我不能写它…非常感谢