gpt4 book ai didi

arrays - 在 bash 中重命名文件的特定模式

转载 作者:行者123 更新时间:2023-11-29 09:21:45 25 4
gpt4 key购买 nike

我有以下文件和目录:

/tmp/jj/
/tmp/jj/ese
/tmp/jj/ese/2010
/tmp/jj/ese/2010/test.db
/tmp/jj/dfhdh
/tmp/jj/dfhdh/2010
/tmp/jj/dfhdh/2010/rfdf.db
/tmp/jj/ddfxcg
/tmp/jj/ddfxcg/2010
/tmp/jj/ddfxcg/2010/df.db
/tmp/jj/ddfnghmnhm
/tmp/jj/ddfnghmnhm/2010
/tmp/jj/ddfnghmnhm/2010/sdfs.db

我想将所有 2010 目录重命名为它们的父目录,然后 tar 所有 .db 文件...

我尝试的是:

#!/bin/bash

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

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

find $1 >> /tmp/test
for line in $(cat /tmp/test)
do
arr=$( (echo $line | awk -F"/" '{for (i = 1; i < NF; i++) if ($i == "2010") print $(i-1)}') )
for index in "${arr[@]}"
do
echo $index #HOW TO WRITE MV COMMAND RATHER THAN ECHO COMMAND?
done
done

1) 结果是:

ese


dfhdh


ddfxcg


ddfnghmnhm

但应该是:

ese
dfhdh
ddfxcg
ddfnghmnhm

2) 如何将所有 2010 目录重命名为它们的父目录?我的意思是怎么做(我想在 loop 中做,因为目录数量很大):

mv /tmp/jj/ese/2010 /tmp/jj/ese/ese
mv /tmp/jj/dfhdh/2010 /tmp/jj/dfhdh/dfhdh
mv /tmp/jj/ddfxcg/2010 /tmp/jj/ddfxcg/ddfxcg
mv /tmp/jj/ddfnghmnhm/2010 /tmp/jj/ddfnghmnhm/ddfnghmnhm

最佳答案

您可以改为使用 find 来确定目录是否包含名为 2010 的子目录并执行 mv:

find /tmp -type d -exec sh -c '[ -d "{}"/2010 ] && mv "{}"/2010 "{}"/$(basename "{}")' -- {} \;

我不确定您在这里是否还有其他问题,但这会执行您在问题末尾列出的内容,即:

mv /tmp/jj/ese/2010 /tmp/jj/ese/ese

等等……

关于arrays - 在 bash 中重命名文件的特定模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23040109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com