如何在bash中替换文件夹和文件名?

时间:2016-06-23 14:01:45

标签: bash

我有很多带空格和大写字母的文件夹,以及带空格和主题标签的文件。我想摆脱一个文件夹中所有子文件夹中的空格和大写字母,并将文件名更改为没有空格和主题标签的文件名。我怎么能这样做?

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

2 个答案:

答案 0 :(得分: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,它将为您完成工作。

答案 1 :(得分: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之前检查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