Bash - 将数字移动到特定的字符串位置
Bash - Move a number into a specific string location
我正在尝试了解如何更改脚本以使输出文件不是 TEST.doc
、TEST.doc1
、TEST.doc12
等,而是 TEST.doc
、TEST_1.doc
、TEST_2.doc
等。更简单地说,就在具体已知的.extension
之前。(txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf
).
我该怎么做?
这里是脚本
#!/bin/bash
rename_files() {
title="${1##* - }"
for filename in "/"*.*; do
case "${filename##*.}" in
txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf)
mkdir -p -m 777 "/Users/Desktop/Documents Share/Downloaded/${title}"
new_path="/Users/Desktop/Documents Share/Downloaded/${title}/${title}.${filename##*.}"
let "iters=1"
while [ -f "$new_path" ] ; do
new_path=$new_path"$iters"
let "iters++"
done
echo "moving $filename -> $new_path"
mv "${filename}" "${new_path}"
;;
esac
done
}
rename_category() {
for path in "/Users/Desktop/Documents Share/Downloads/"*; do
rename_files "$path" ""
done
}
rename_category DOC
编辑:
fromdir="/Users/Desktop/Downloads/"
todir="/Users/Desktop/Documents Share/Downloaded//"
rename_files() {
title="${1##* - }"
let "iters=0"
for filename in "/"*.*; do
case "${filename##*.}" in txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf)
new_path="${todir}//${title}.${filename##*.}"
new_path=$new_path # removed "$iters"
let "iters++"
# extract $path without dot + extension
new_path_basename=${new_path%*.*};
# Extract extension from $path
ext=${new_path##*.};
echo "moving $filename -> ${new_path_basename}_${iters}.${ext}"
# Add ${iters} before extension
mv "${filename}" "${new_path_basename}_${iters}.${ext}"
;;
esac
done
}
rename_category() {
for path in "${fromdir}"*; do
rename_files "$path" ""
done
}
rename_category DOC
rename_category PRJ
之前:
/Users/Desktop/Downloads/DOC - TESTDOC/AFile.doc
/AnotherFile.doc
/Users/Desktop/Downloads/PRJ - TESTPRJ/AFile.pdf
/AnotherFile.pdf
之后:
/Users/Desktop/Documents Share/Downloaded/DOC/TESTDOC_1.doc
/TESTDOC_2.doc
/Users/Desktop/Documents Share/Downloaded/PRJ/TESTPRJ_1.pdf
/TESTPRJ_2.pdf
EDIT2:
有两个测试文件:
big_buck_bunny_240p_50mb.mp4
和 big_buck_bunny_240p_50mb copy.mp4
输出日志
sh Script.sh
moving /Users/Desktop/Downloads/MOV - TEST/big_buck_bunny_240p_50mb copy.mp4 -> /Users/Desktop/Documents Share/Downloaded/MOV/TEST_1.mp4
cp /Users/Desktop/Downloads/MOV - TEST/big_buck_bunny_240p_50mb copy.mp4 /Users/Desktop/Documents Share/Downloaded/MOV/TEST_1.mp4
moving /Users/Desktop/Downloads/MOV - TEST/big_buck_bunny_240p_50mb.mp4 -> /Users/Desktop/Documents Share/Downloaded/MOV/TEST_2.mp4
cp /Users/Desktop/Downloads/MOV - TEST/big_buck_bunny_240p_50mb.mp4 /Users/albertorapolla/Desktop/Documents Share/Downloaded/MOV/TEST_2.mp4
EDIT3:
脚本的最后更新(不是 "special" 那个)
#!/bin/bash
fromdir="/Users/Desktop/Downloads/"
todir="/Users/Desktop/Documents Share/Downloaded/"
rename_files() {
title="${1##* - }"
exttitle=""
iters=0
numfiles=$(ls -l "/"*.* | wc -l)
for filename in "/"*.*; do
new_path="${todir}${title}/${title}.${filename##*.}"
iters=_$(( ++i ))
# extract $path without dot + extension
new_path_basename=${new_path%*.*};
# Extract extension from $path
ext=${new_path##*.};
if [ "$numfiles" -eq 1 ]; then
iters=""
fi
case "${filename##*.}" in txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf)
mkdir -p -m 777 "${todir}${title}"
echo "moving $filename -> ${new_path_basename}${iters}.${ext}"
# Add ${iters} before extension
mv "${filename}" "${new_path_basename}${iters}.${ext}"
;;
esac
done
}
rename_category() {
for path in "${fromdir}"*; do
rename_files "$path" ""
done
}
rename_category DOC
试试这个(评论在脚本中):
rename_files() {
title="${1##* - }"
exttitle=""
iters=0
numfiles=$(ls -l "/"*.* | wc -l)
for filename in "/"*.*; do
new_path="${todir}${exttitle}/${title}.${filename##*.}"
iters=_$(( ++i ))
# extract $path without dot + extension
new_path_basename=${new_path%*.*};
# Extract extension from $path
ext=${new_path##*.};
if [ "$numfiles" -eq 1 ]; then
iters=""
fi
case "${filename##*.}" in txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf)
mkdir -p -m 777 "${todir}${exttitle}"
echo "moving $filename -> ${new_path_basename}${iters}.${ext}"
# Add ${iters} before extension
mv "${filename}" "${new_path_basename}${iters}.${ext}"
;;
esac
done
}
rename_category() {
for path in "${fromdir}"*; do
rename_files "$path" ""
done
}
rename_category DOC
我正在尝试了解如何更改脚本以使输出文件不是 TEST.doc
、TEST.doc1
、TEST.doc12
等,而是 TEST.doc
、TEST_1.doc
、TEST_2.doc
等。更简单地说,就在具体已知的.extension
之前。(txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf
).
我该怎么做?
这里是脚本
#!/bin/bash
rename_files() {
title="${1##* - }"
for filename in "/"*.*; do
case "${filename##*.}" in
txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf)
mkdir -p -m 777 "/Users/Desktop/Documents Share/Downloaded/${title}"
new_path="/Users/Desktop/Documents Share/Downloaded/${title}/${title}.${filename##*.}"
let "iters=1"
while [ -f "$new_path" ] ; do
new_path=$new_path"$iters"
let "iters++"
done
echo "moving $filename -> $new_path"
mv "${filename}" "${new_path}"
;;
esac
done
}
rename_category() {
for path in "/Users/Desktop/Documents Share/Downloads/"*; do
rename_files "$path" ""
done
}
rename_category DOC
编辑:
fromdir="/Users/Desktop/Downloads/"
todir="/Users/Desktop/Documents Share/Downloaded//"
rename_files() {
title="${1##* - }"
let "iters=0"
for filename in "/"*.*; do
case "${filename##*.}" in txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf)
new_path="${todir}//${title}.${filename##*.}"
new_path=$new_path # removed "$iters"
let "iters++"
# extract $path without dot + extension
new_path_basename=${new_path%*.*};
# Extract extension from $path
ext=${new_path##*.};
echo "moving $filename -> ${new_path_basename}_${iters}.${ext}"
# Add ${iters} before extension
mv "${filename}" "${new_path_basename}_${iters}.${ext}"
;;
esac
done
}
rename_category() {
for path in "${fromdir}"*; do
rename_files "$path" ""
done
}
rename_category DOC
rename_category PRJ
之前:
/Users/Desktop/Downloads/DOC - TESTDOC/AFile.doc
/AnotherFile.doc
/Users/Desktop/Downloads/PRJ - TESTPRJ/AFile.pdf
/AnotherFile.pdf
之后:
/Users/Desktop/Documents Share/Downloaded/DOC/TESTDOC_1.doc
/TESTDOC_2.doc
/Users/Desktop/Documents Share/Downloaded/PRJ/TESTPRJ_1.pdf
/TESTPRJ_2.pdf
EDIT2:
有两个测试文件:
big_buck_bunny_240p_50mb.mp4
和 big_buck_bunny_240p_50mb copy.mp4
输出日志
sh Script.sh
moving /Users/Desktop/Downloads/MOV - TEST/big_buck_bunny_240p_50mb copy.mp4 -> /Users/Desktop/Documents Share/Downloaded/MOV/TEST_1.mp4
cp /Users/Desktop/Downloads/MOV - TEST/big_buck_bunny_240p_50mb copy.mp4 /Users/Desktop/Documents Share/Downloaded/MOV/TEST_1.mp4
moving /Users/Desktop/Downloads/MOV - TEST/big_buck_bunny_240p_50mb.mp4 -> /Users/Desktop/Documents Share/Downloaded/MOV/TEST_2.mp4
cp /Users/Desktop/Downloads/MOV - TEST/big_buck_bunny_240p_50mb.mp4 /Users/albertorapolla/Desktop/Documents Share/Downloaded/MOV/TEST_2.mp4
EDIT3:
脚本的最后更新(不是 "special" 那个)
#!/bin/bash
fromdir="/Users/Desktop/Downloads/"
todir="/Users/Desktop/Documents Share/Downloaded/"
rename_files() {
title="${1##* - }"
exttitle=""
iters=0
numfiles=$(ls -l "/"*.* | wc -l)
for filename in "/"*.*; do
new_path="${todir}${title}/${title}.${filename##*.}"
iters=_$(( ++i ))
# extract $path without dot + extension
new_path_basename=${new_path%*.*};
# Extract extension from $path
ext=${new_path##*.};
if [ "$numfiles" -eq 1 ]; then
iters=""
fi
case "${filename##*.}" in txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf)
mkdir -p -m 777 "${todir}${title}"
echo "moving $filename -> ${new_path_basename}${iters}.${ext}"
# Add ${iters} before extension
mv "${filename}" "${new_path_basename}${iters}.${ext}"
;;
esac
done
}
rename_category() {
for path in "${fromdir}"*; do
rename_files "$path" ""
done
}
rename_category DOC
试试这个(评论在脚本中):
rename_files() {
title="${1##* - }"
exttitle=""
iters=0
numfiles=$(ls -l "/"*.* | wc -l)
for filename in "/"*.*; do
new_path="${todir}${exttitle}/${title}.${filename##*.}"
iters=_$(( ++i ))
# extract $path without dot + extension
new_path_basename=${new_path%*.*};
# Extract extension from $path
ext=${new_path##*.};
if [ "$numfiles" -eq 1 ]; then
iters=""
fi
case "${filename##*.}" in txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf)
mkdir -p -m 777 "${todir}${exttitle}"
echo "moving $filename -> ${new_path_basename}${iters}.${ext}"
# Add ${iters} before extension
mv "${filename}" "${new_path_basename}${iters}.${ext}"
;;
esac
done
}
rename_category() {
for path in "${fromdir}"*; do
rename_files "$path" ""
done
}
rename_category DOC