2016-06-23 81 views
0

我有很多带空格和大写字母的文件夹,以及带空格和井号标签的文件。我想摆脱一个文件夹中所有子文件夹中的空格和大写字母,并将文件名改为没有空格和标签的文件名。我怎样才能做到这一点?如何在bash中替换文件夹和文件名?

我的输入是目录的路径,例如'/ Images'。在'Images'文件夹中,我有文件夹,如'Mary','Kate'等。这些文件夹包含诸如'Kate#1.png''Kate#2.png'之类的图像。我想将'Images'中的所有文件夹名称更改为'mary','kate'等,并将所有文件名改为'kate1.png','kate2.png'。

+0

请提供样品的输入和预期的输出 – Inian

+0

@Inian我已经更新了我的问题 – uksz

回答

1

里面目录图片/,一个选择可能是

find . -mindepth 1 -type d | while read f; do mv -v "$f" "$(echo "$f" | tr [:upper:] [:lower:] | tr -d ' #')"; done 
find . -mindepth 1 -type f | while read f; do mv -v "$f" "$(echo "$f" | tr [:upper:] [:lower:] | tr -d ' #')"; done 

这两条线也可以通过for type in d f; do ...; done他们周围,因为类型是唯一改变的内容组合成一个;但我认为这更容易理解。

如果您不喜欢文件名不发生变化时的警告,您可以在之前检查f和新文件是否相同。

编辑:这是一个小型的独立脚本来完成您的任务。至于你说你输入的目录,我假设你将它传递给脚本作为命令行参数$ 1

#!/bin/bash 

if [ -z "$1" ]; then 
    echo "usage: $0 directory" 
    exit -1 
fi 

cd "$1" 

for type in d f 
do 
    find . -mindepth 1 -type $type | while read f 
    do 
     mv -v "$f" "$(echo "$f" | tr [:upper:] [:lower:] | tr -d ' #')" 
    done 
done 
1
cd yourPath 

然后给这两条线一试:

find . -type d|awk -vq='"' '{o=$0;gsub(/[# ]/,"");$0=tolower($0)}$0!=o{printf "mv %s%s%s %s%s%s\n",q,o,q,q,$0,q}' 
find . -type f|awk -vq='"' '{o=$0;gsub(/[# ]/,"");$0=tolower($0)}$0!=o{printf "mv %s%s%s %s%s%s\n",q,o,q,q,$0,q}' 

如果打印mv ..命令是否正确,加|sh到命令结束,它会为你做的工作。

相关问题