5

这个标题有点混乱,所以让我分解一下。基本上,我有一个完整的文件目录,其中包含各种名称和扩展名:

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,而不是依赖于特定于操作系统的调用。我究竟做错了什么?为了做我需要的事情,我可以改变什么或什么代码可以工作?

4

2 回答 2

6
#!/bin/sh -e 
cd "${1-.}"

for f in *; do  
  cp "$f" "${f%.*}@2x.${f##*.}"
done
于 2012-10-11T16:26:54.743 回答
2

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 }' 
于 2015-02-07T15:49:14.667 回答