Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sed重命名bash中的目录_Bash_Sed - Fatal编程技术网

使用sed重命名bash中的目录

使用sed重命名bash中的目录,bash,sed,Bash,Sed,我有几个要重命名的目录: 等: “duedate year”目录到“duedate”(仅删除-year) “开始年份”目录到“开始” 这就是我尝试过的: for CACHE in `find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*year" ` ; do set UPDATE="awk -F"-year" '{print $1}' $CACHE" ; mv $CACHE $UPDATE done 然而,它没有成功。是否需要使用“sed

我有几个要重命名的目录: 等: “duedate year”目录到“duedate”(仅删除-year) “开始年份”目录到“开始”

这就是我尝试过的:

for CACHE in `find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*year" ` ;
do
set UPDATE="awk -F"-year" '{print $1}' $CACHE" ;
mv $CACHE  $UPDATE
done

然而,它没有成功。是否需要使用“sed”命令重命名目录?

您错误地分配了
awk
的结果。它应该在backticks或
$(…)
中。要处理变量,需要通过管道
echo$CACHE
,而不是使用
$CACHE
作为文件名参数(将处理文件内容)。所以这条线应该是:

UPDATE=$(echo "$CACHE" | awk -F-year '{print $1}`)
变量不是使用
set
赋值的,您只需编写
var=value

所以这条线应该是:

UPDATE=$(echo "$CACHE" | awk -F-year '{print $1}`)
但根本不需要使用
awk
为此,您可以使用shell变量展开运算符:

UPDATE=${CACHE%%-year*}

%%year*
表示删除与通配符
-year*

匹配的值的最长尾随部分,因为您分配的
awk
结果不正确。它应该在backticks或
$(…)
中。要处理变量,需要通过管道
echo$CACHE
,而不是使用
$CACHE
作为文件名参数(将处理文件内容)。所以这条线应该是:

UPDATE=$(echo "$CACHE" | awk -F-year '{print $1}`)
变量不是使用
set
赋值的,您只需编写
var=value

所以这条线应该是:

UPDATE=$(echo "$CACHE" | awk -F-year '{print $1}`)
但根本不需要使用
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之后,我发布了一个更加健壮的版本(),这是Ed Morton在下面回答的“代码提升”

find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*-year"|
while IFS= read -r DIR  
do 
    mv "${DIR}" $(echo "${DIR}" | sed -E 's/year//')        
done

是的,你可以用管子。我这样做:

for DIR in $(find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*year"); do 
    mv "${DIR}" $(echo "${DIR}" | sed -E 's/year//')        
done
应该注意的是,我非常自学成才,有时也有坏习惯

在咨询gniourf_gniourf之后,我发布了一个更加健壮的版本(),这是Ed Morton在下面回答的“代码提升”

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 's/-year//' *year

或者使用
重命名
命令

rename 's/-year//' *year
许多shell解决方案将对给定的样本输入集“起作用”,然后在以后发生灾难性的爆炸,通常是由于未引用的变量、对空格的错误处理等。这应该是安全的,除非您的文件名包含换行符(在这种情况下,请参见
find-print0
xargs-0
):

许多shell解决方案将对给定的样本输入集“起作用”,然后在以后发生灾难性的爆炸,通常是由于未引用的变量、对空格的错误处理等。这应该是安全的,除非您的文件名包含换行符(在这种情况下,请参见
find-print0
xargs-0
):


您需要使用backticks或
$(…)
来运行命令并将输出分配给变量。您的
awk
命令改为双引号。您需要使用反勾号或
$(…)
来运行命令并将输出分配给变量。您的
awk
命令改为双引号。乔布斯显然将“regex”自动更正为“reggae”,但这是一个有趣的自动更正,所以我将把它留下。这里确实有很多坏习惯:
对于$(find…
中的DIR是非常糟糕的:当文件名包含空格或全局字符时,它会中断;出于同样的原因,您也需要引用所有变量。有趣的是,您在变量名周围使用了非常无用的卷曲,但拒绝使用高度强制的引号。如图所示。主要问题是$(find…)中DIR的
,因此必须重新考虑整个设计。埃德·莫顿(Ed Morton)的解决方案是最稳健的解决方案之一(最稳健的解决方案是我在其博文
:D
的评论中给出的)。感谢您提出的建设性观点。由于我的帖子已被“接受”,我将补充提及他的帖子。乔布斯显然将“regex”自动更正为“reggae”,但这是一个有趣的自动更正,所以我将把它留下。这里确实有很多坏习惯:
对于$(find…
中的DIR是非常糟糕的:当文件名包含空格或全局字符时,它会中断;出于同样的原因,您也需要引用所有变量。有趣的是,您在变量名周围使用了非常无用的卷曲,但拒绝使用高度强制的引号。如图所示。主要问题是$(find…)中DIR的
,因此必须重新考虑整个设计。埃德·莫顿(Ed Morton)的解决方案是最稳健的解决方案之一(最稳健的解决方案是我在其博文
:D
的评论中给出的)。感谢您提出的建设性观点。我将添加对他的文章的引用,因为我的文章被“接受”。这篇文章因包含换行符的文件名而爆炸(我知道这很不可能,但仍然有可能)。解决此问题的两种方法:使用带有空字节分隔符的
print0
read
,或者:
查找“$DESTINATION\u REPO”-maxdepth 1-type d-name”*-year”-exec bash-c”作为缓存;do mv--“$CACHE”“${CACHE/-year}”;完成“{}+
,这个文件名包含换行符(我知道这不太可能,但仍然可能)。解决此问题的两种方法:使用带有空字节分隔符的
print0
read
,或者:
查找“$DESTINATION\u REPO”-maxdepth 1-type d-name”*-year”-exec bash-c”作为缓存;do mv--“$CACHE”“${CACHE/-year}”;完成'{}+