首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash中使用数组并执行其他操作

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

Stack Overflow用户
提问于 2014-04-13 12:56:39
回答 3查看 165关注 0票数 0

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

借助@merlin2011

代码语言:javascript
复制
#!/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

现在,我想从数组中检查find命令的结果,如果有一个名为2010的目录,那么就得到它的绝对路径。例如:

代码语言:javascript
复制
arr[1]="/path/to/2010/file.db"

然后,我想将2010重命名为父目录to。我的模式是:

代码语言:javascript
复制
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"

结果应该是:

代码语言:javascript
复制
mv /path/to/2010/ to
mv /path/test/2010 test
mv /path/tt/2010/ tt
.
.
.
mv /path/last/2010 last

更新:

总而言之,我想知道如何在awk中反向获取变量。

代码语言:javascript
复制
/path/to/dir1/2010/file.db

我想在absolute path中搜索,然后使用/ pattern like : awk -F"/" {print [what?]}在之前的路径中查找2010并将其重命名

告诉awk我的状态是2010,然后在它之前打印一个变量,因为知道拆分器是/

更新

文件目录和子目录模式为:

代码语言:javascript
复制
/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 .db

这正是我想要的:)

EN

回答 3

Stack Overflow用户

发布于 2014-04-13 13:27:37

此答案仅针对OP的更新。我的最佳解释是,您试图让awk在字符串/path/to/dir1/2010/file.db内打印值dir1。下面这行代码将实现这一点。

代码语言:javascript
复制
awk -F"/" '{for (i = 1; i < NF; i++) if ($i == "2010") print $(i-1)}'

我使用以下命令进行了测试,该命令将输出dir1

代码语言:javascript
复制
echo /path/to/dir1/2010/file.db | awk -F"/" '{for (i = 1; i < NF; i++) if ($i == "2010") print $(i-1)}'

根据您的更新,您应该用backtic操作符将awk命令括起来。

代码语言:javascript
复制
mv $2 `awk -F"/" '{for (i = 1; i < NF; i++) if ($i == "$2") print $(i-1)}'`
票数 2
EN

Stack Overflow用户

发布于 2014-04-13 13:05:55

代码语言:javascript
复制
        To implement, we have to do the recursive folder search.

        It should be combination of two commands like find and mv




        find . -name "2010" -exec mv {} /some/path/here \;


Other way shared by merlin2011
    mv $2 awk -F"/" `'{for (i = 1; i < NF; i++) if ($i == "$2") print $(i-1)}'`
票数 1
EN

Stack Overflow用户

发布于 2014-04-13 13:50:18

下面是awk命令:

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

一旦您感到满意,请在系统命令中删除echo

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23039264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档