这个标题有点令人困惑,所以让我分解一下。基本上我有一个包含各种名称和扩展名的完整文件目录:
MainDirectory/
image_1.png
foobar.jpeg
myFile.txt
对于iPad应用程序,我需要在扩展名之前创建所有这些文件名末尾附加后缀 @ 2X 的副本 - 所以我最终会这样:
MainDirectory/
image_1.png
image_1@2X.png
foobar.jpeg
foobar@2X.jpeg
myFile.txt
myFile@2X.txt
我不是手动一次更改一个文件名,而是想创建一个脚本来为我处理它。我目前有以下内容,但它没有按预期工作:
#!/bin/bash
FILE_DIR=.
#if there is an argument, use that as the files directory. Otherwise, use .
if [ $# -eq 1 ]
then
$FILE_DIR=$1
fi
for f in $FILE_DIR/*
do
echo "Processing $f"
filename=$(basename "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"
newFileName=$(echo -n $filename; echo -n -@2X; echo -n $extension)
echo Creating $newFileName
cp $f newFileName
done
exit 0
我也希望将其保留为纯粹的bash,而不是依赖于os特定的调用。我究竟做错了什么?为了做我需要的,我可以改变什么或代码将起作用?
答案 0 :(得分:6)
#!/bin/sh -e
cd "${1-.}"
for f in *; do
cp "$f" "${f%.*}@2x.${f##*.}"
done
答案 1 :(得分:1)
使用awk
在一行中很容易做到这一点:
ls -1 | awk -F "." ' { print "cp " $0 " " $1 "@2X." $2 }' | sh
使用ls -1
只得到文件的裸列表,然后管道awk
以使用点(。)作为分隔符。然后构建一个shell命令来创建每个文件的副本。
我建议在没有最后一个sh
管道的情况下运行该命令,以便检查cp
命令是否正确。像这样:
ls -1 | awk -F "." ' { print "cp " $0 " " $1 "@2X." $2 }'