使用 sed 重命名 bash 中的目录
Renaming directories in bash using sed
我有几个目录要重命名:
ETC:
"duedate-year" 目录到 "duedate" (只删除 -year)
"start-year" 目录到 "start"
这是我试过的:
for CACHE in `find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*year" ` ;
do
set UPDATE="awk -F"-year" '{print }' $CACHE" ;
mv $CACHE $UPDATE
done
但是没有成功。是否可以使用 "sed" 命令重命名目录?
您错误地分配了 awk
的结果。它应该在反引号或 $(...)
内。要处理一个变量,您需要将 echo $CACHE
传递给它,而不是使用 $CACHE
作为文件名参数(这将处理文件的 内容 )。所以那一行应该是:
并且没有使用 set
分配变量,您只需编写 var=value
.
所以那一行应该是:
UPDATE=$(echo "$CACHE" | awk -F-year '{print }`)
但是根本不需要为此使用awk
,您可以使用shell变量扩展运算符:
UPDATE=${CACHE%%-year*}
%%year*
表示删除与通配符 -year*
.
匹配的值的最长尾随部分
是的,您可以使用管道。我这样做:
for DIR in $(find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*year"); do
mv "${DIR}" $(echo "${DIR}" | sed -E 's/year//')
done
需要注意的是,我非常自学,有时会有一些坏习惯...
在咨询 gniourf_gniourf 之后,我发布了一个更强大的版本 (read more),它是下面 Ed Morton 的回答 "code lift"。
find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*-year"|
while IFS= read -r DIR
do
mv "${DIR}" $(echo "${DIR}" | sed -E 's/year//')
done
或者使用rename
命令
rename 's/-year//' *year
许多 shell 解决方案将 "work" 对于给定的样本输入集,然后在以后灾难性地爆炸,通常是由于未引用的变量、空白处理不正确等。这应该是安全的,除非你文件名包含换行符(在这种情况下请参阅 find -print0
和 xargs -0
):
find "$DESTINATION_REPO" -maxdepth 1 -type d -name "*-year" |
while IFS= read -r CACHE
do
mv -- "$CACHE" "${CACHE%-year}"
done
我有几个目录要重命名: ETC: "duedate-year" 目录到 "duedate" (只删除 -year) "start-year" 目录到 "start"
这是我试过的:
for CACHE in `find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*year" ` ;
do
set UPDATE="awk -F"-year" '{print }' $CACHE" ;
mv $CACHE $UPDATE
done
但是没有成功。是否可以使用 "sed" 命令重命名目录?
您错误地分配了 awk
的结果。它应该在反引号或 $(...)
内。要处理一个变量,您需要将 echo $CACHE
传递给它,而不是使用 $CACHE
作为文件名参数(这将处理文件的 内容 )。所以那一行应该是:
并且没有使用 set
分配变量,您只需编写 var=value
.
所以那一行应该是:
UPDATE=$(echo "$CACHE" | awk -F-year '{print }`)
但是根本不需要为此使用awk
,您可以使用shell变量扩展运算符:
UPDATE=${CACHE%%-year*}
%%year*
表示删除与通配符 -year*
.
是的,您可以使用管道。我这样做:
for DIR in $(find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*year"); do
mv "${DIR}" $(echo "${DIR}" | sed -E 's/year//')
done
需要注意的是,我非常自学,有时会有一些坏习惯...
在咨询 gniourf_gniourf 之后,我发布了一个更强大的版本 (read more),它是下面 Ed Morton 的回答 "code lift"。
find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*-year"|
while IFS= read -r DIR
do
mv "${DIR}" $(echo "${DIR}" | sed -E 's/year//')
done
或者使用rename
命令
rename 's/-year//' *year
许多 shell 解决方案将 "work" 对于给定的样本输入集,然后在以后灾难性地爆炸,通常是由于未引用的变量、空白处理不正确等。这应该是安全的,除非你文件名包含换行符(在这种情况下请参阅 find -print0
和 xargs -0
):
find "$DESTINATION_REPO" -maxdepth 1 -type d -name "*-year" |
while IFS= read -r CACHE
do
mv -- "$CACHE" "${CACHE%-year}"
done