Bash 按名称递归查找所有文件,使用shell脚本解密并重命名它们

Bash 按名称递归查找所有文件,使用shell脚本解密并重命名它们,bash,shell,Bash,Shell,我正在尝试编写一个脚本来查找名称中包含.production的所有文件,解密这些文件并保存它们的副本,而不包含.production 示例文件: ./functions/key.production.json ./src/config.production.js 这是我的密码: decrypt() { echo $1 for file in $(find . -name "*.$1.*") do echo "some $file" openssl enc

我正在尝试编写一个脚本来查找名称中包含.production的所有文件,解密这些文件并保存它们的副本,而不包含.production

示例文件:

./functions/key.production.json
./src/config.production.js
这是我的密码:

decrypt() {
  echo $1

  for file in $(find . -name "*.$1.*")
  do
      echo "some $file"
      openssl enc -aes-128-cbc -a -d -salt -pass pass:asdffdsa -in $file -out $(sed -e "p;s/.$1//")
  done
}
$sed-EP;s/$1//是挂起的部分。您可以通过添加set-x并执行脚本来检查这一点。这是因为sed需要一个输入文件/流,而没有给它任何文件/流

您可以使用bash子字符串替换${file/.$1}

${string//$substring\u to\u remove/}

在主字符串中,在//之后出现的所有内容都将替换为最后一个字符串之后的内容/

因此,工作函数是

decrypt() {
  echo $1

  for file in $(find . -name "*.$1.*")
  do
      echo "some $file"
      openssl enc -aes-128-cbc -a -d -salt -pass pass:asdffdsa -in $file -out "${file//.$1}"
  done
}

您可以避免使用subshell$find-姓名。1美元。通过使用while循环

decrypt() {
  echo "$1"
  local file
  while read -r file; do
    echo "some $file"
    PROCESS-YOUR-FILE-AND-DO-YOUR-STUFF_HERE
  done < <(find . -name "*.$1.*")
}

请参见

是否有任何错误?有什么问题吗?@franzisk没有错误,没有效果。只是回显第一个文件名,为什么我需要避免它?如果在某些文件/路径名中有空格或换行符,则在处理输出时会出现一些错误。现在可能发生,也可能不发生,但会的。