我有目录:
- 富
- 费用
但我也有一些目录,其名称如下:
- Ipsum - 洛雷姆
- 多洛 - 坐
如果目录不包含连字符,则应忽略如果目录包含连字符:Mkdir Ipsum; mv Ipsum\ -\ * Ipsum
这可能吗?
编辑以澄清:如果有一个带有连字符的目录,我想根据连字符前部分创建一个新目录名称,然后将包含连字符前部分的所有目录移动到该新目录中。
答案1
您可以使用 bash 子字符串扩展功能。
${parameter%%word} 删除匹配的后缀模式。
for f in *;do
mv "$f" "${f%% -*}"
done
答案2
对的,这是可能的。将这样的代码放入一个文件中,例如 fix-dashes.sh (我使用的是 Mac OS,但这应该适用于其他 Unices):
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
trap 'IFS=$SAVEIFS' 0
for i in $@
do
echo Processing $i
case $i in
*-*)
echo "'$i' has a dash"
destname=$(echo "$i" | sed 's/ -.*//')
echo mv "$i" $destname
mv "$i" $destname
;;
esac
done
然后bash fix-dash.sh */
将按照您指定的方式重命名目录。斜杠很重要,这样您只能获取目录名称,否则带有破折号的常规文件将受到影响。
`IFS 包含单词的分隔符,并且由于您的文件名包含空格,因此您需要调整。
我喜欢使用有限的正则表达式机制,因为它模仿命令行上case
使用的 RE 。bash
在这种情况下,只有包含破折号的名称才会导致执行重命名。
该sed
命令执行转换,在本例中,用空字符串替换第一个之后的所有内容。