如何在非交互模式下解压缩gzip文件而不覆盖原始文件

8

我希望能够解压缩.gz文件,但不希望覆盖原有文件。当解压后的文件存在时,gunzip会要求确认是否覆盖原有文件,但我希望gunzip默认不覆盖并中止解压。我在man文档中读到-f参数可以强制覆盖原有文件,但没有找到跳过该选项的相关信息。

gunzip ${file} 

我需要类似于 -n 的选项,用于复制文件 cp -n ${file}


你的问题不是很明确。默认情况下,gunzip 不会覆盖现有的文件。 - Chris Maes
默认情况下,它会询问是否覆盖。 - herder
好的,所以您想要一个非交互式的gunzip,它不会覆盖文件吗? - Chris Maes
如果是这样的话,konsolebox的答案就可以了...如果它能满足您的需求,您可以接受它。如果不行,请更清楚地表达您的问题。 - Chris Maes
是的,他的回答没问题,但我得等5分钟才能接受它 ;) - herder
3个回答

27

gunzip将在覆盖文件之前提示您。 您可以使用yes命令自动将n字符串发送到gunzip提示符中,如下所示:

$ yes n | gunzip file*.gz
gunzip: file already exists;    not overwritten
gunzip: file2 already exists;    not overwritten

如何在不提示的情况下发送“y”以覆盖? - seralouk
这会导致一个断开的管道。 - seralouk
@seralouk,根据手册,您可以使用--force标志:gunzip -f file*.gz。 - iquestionshard

8

如果您的文件扩展名为 .gz,在运行 gunzip 前可以检查文件是否存在:

[[ -e ${file%.gz} ]] || gunzip "${file}"

[[ -e ${file%.gz} ]]的作用是删除.gz并检查是否存在一个与其名称相同的文件。如果不存在(false),则会执行gunzip "${file}"


3

这是本文和这里答案的结合,可以将一组被gz压缩的文件解压到不同的目标目录中:

dest="unzipped"
for f in *.gz; do
  STEM=$(basename "${f}" .gz)
  unzipped_name="$dest/$STEM"
  echo ''
  echo gunzipping $unzipped_name
  if [[ -e $unzipped_name ]]; then
    echo file exists
  else
    gunzip -c "${f}" > $unzipped_name
    echo done
  fi
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接