根据文件名创建目录名称

时间:2014-10-07 03:30:49

标签: linux bash shell unix scripting

在我的脚本中,我正在获取一个文本文件并分成几个部分。在进行任何拆分之前,我正在重新格式化文本文件的名称。问题:创建文件夹/目录并将其命名为格式化文件名。这是放置段的位置。但是,当文本文件中包含空格时,脚本会中断。但这就是我试图首先重新格式化名称然后进行其余操作的原因。我怎么能按顺序这样做?

执行脚本:text_split.sh -s "my File .txt" -c 2

text_split.sh

# remove whitespace and format file name
FILE_PATH="/archive/"
find $FILE_PATH -type f -exec bash -c 'mv "$1" "$(echo "$1" \
| sed -re '\''s/^([^-]*)-\s*([^\.]*)/\L\1\E-\2/'\'' -e '\''s/ /_/g'\'' -e '\''s/_-/-/g'\'')"' - {} \;
sleep 1

# arg1: path to input file / source
# create directory 
function fallback_out_file_format() {
     __FILE_NAME=`rev <<< "$1" | cut -d"." -f2- | rev`
     __FILE_EXT=`rev <<< "$1" | cut -d"." -f1 | rev`
     mkdir -p $FILE_PATH${__FILE_NAME};
     __OUT_FILE_FORMAT="$FILE_PATH${__FILE_NAME}"/"${__FILE_NAME}-part-%03d.${__FILE_EXT}"
     echo $__OUT_FILE_FORMAT
     exit 1 
}

# Set variables and default values
OUT_FILE_FORMAT=''

# Grab input arguments
while getopts “s:c” OPTION
do
     case $OPTION in
         s) SOURCE=$(echo "$OPTARG" | sed 's/ /\\ /g' ) ;;
         c) CHUNK_LEN="$OPTARG" ;;
         ?) usage
            exit 1
            ;;
     esac
done

if [ -z "$OUT_FILE_FORMAT" ] ; then
    OUT_FILE_FORMAT=$(fallback_out_file_format $SOURCE)
fi

3 个答案:

答案 0 :(得分:0)

您可以使用tr -d ' '修剪输入字符串中的空格。

然后,您可以使用以下内容将其加入FILE_PATH变量:

FILE_NAME=$(echo $1 | tr -d ' ')
FILE_PATH="/archive/"
FILE_PATH=$FILE_PATH$FILE_NAME

答案 1 :(得分:0)

您的脚本采用带-s指定的文件名参数,然后通过重命名其包含的文件来修改硬编码目录,然后使用初始文件名生成输出目录和文件名。听起来好像应该调整工作流程。例如,不要尝试更正/ archive /中的所有错误文件名,只需修复使用-s指定的文件的名称。

要获取文件名和扩展名,请使用bash的字符串操作功能,如this question所示:

filename="${fullfile##*/}"
extension="${filename##*.}"
name="${filename%.*}"

答案 2 :(得分:0)

您可以使用反斜杠\来逃避空间 现在,用户可能并不总是提供反斜杠,因此脚本可以使用sed将所有(空格)转换为\

sed 's/ /\ /g'

您可以获取新目录名称

dir_name=`echo $1 | sed 's/ /\ /g'