1
0
mirror of https://github.com/facebook/zstd.git synced 2025-07-30 22:23:13 +03:00

Keep original file if -c or --stdout is given

Set removeSrcFile back to false when -c or --stdout is used to improve
compatibility with gzip(1) behavior.

gzip(1) is removing the original file on compression unless --stdout or
/-c is used. zstd is defaulting to keep the file unless --rm is used or
when it is called via a gzip symlink, in which it is removing by
default. Specifying -c/--stdout turns this behavior off.
This commit is contained in:
Dirk Müller
2022-02-07 20:39:15 +01:00
parent 8814aa5bfa
commit 3f4f8b04ed
4 changed files with 12 additions and 8 deletions

View File

@ -1,5 +1,5 @@
. .
.TH "ZSTD" "1" "January 2022" "zstd 1.5.2" "User Commands" .TH "ZSTD" "1" "February 2022" "zstd 1.5.2" "User Commands"
. .
.SH "NAME" .SH "NAME"
\fBzstd\fR \- zstd, zstdmt, unzstd, zstdcat \- Compress or decompress \.zst files \fBzstd\fR \- zstd, zstdmt, unzstd, zstdcat \- Compress or decompress \.zst files
@ -165,7 +165,7 @@ Additionally, this can be used to limit memory for dictionary training\. This pa
\fB\-f\fR, \fB\-\-force\fR: disable input and output checks\. Allows overwriting existing files, input from console, output to stdout, operating on links, block devices, etc\. \fB\-f\fR, \fB\-\-force\fR: disable input and output checks\. Allows overwriting existing files, input from console, output to stdout, operating on links, block devices, etc\.
. .
.IP "\(bu" 4 .IP "\(bu" 4
\fB\-c\fR, \fB\-\-stdout\fR: write to standard output (even if it is the console) \fB\-c\fR, \fB\-\-stdout\fR: write to standard output (even if it is the console); keep original files unchanged\.
. .
.IP "\(bu" 4 .IP "\(bu" 4
\fB\-\-[no\-]sparse\fR: enable / disable sparse FS support, to make files with many zeroes smaller on disk\. Creating sparse files may save disk space and speed up decompression by reducing the amount of disk I/O\. default: enabled when output is into a file, and disabled when output is stdout\. This setting overrides default and can force sparse mode over stdout\. \fB\-\-[no\-]sparse\fR: enable / disable sparse FS support, to make files with many zeroes smaller on disk\. Creating sparse files may save disk space and speed up decompression by reducing the amount of disk I/O\. default: enabled when output is into a file, and disabled when output is stdout\. This setting overrides default and can force sparse mode over stdout\.

View File

@ -212,7 +212,7 @@ the last one takes effect.
disable input and output checks. Allows overwriting existing files, input disable input and output checks. Allows overwriting existing files, input
from console, output to stdout, operating on links, block devices, etc. from console, output to stdout, operating on links, block devices, etc.
* `-c`, `--stdout`: * `-c`, `--stdout`:
write to standard output (even if it is the console) write to standard output (even if it is the console); keep original files unchanged.
* `--[no-]sparse`: * `--[no-]sparse`:
enable / disable sparse FS support, enable / disable sparse FS support,
to make files with many zeroes smaller on disk. to make files with many zeroes smaller on disk.

View File

@ -178,7 +178,7 @@ static void usage_advanced(const char* programName)
DISPLAYOUT( "Advanced arguments : \n"); DISPLAYOUT( "Advanced arguments : \n");
DISPLAYOUT( " -V : display Version number and exit \n"); DISPLAYOUT( " -V : display Version number and exit \n");
DISPLAYOUT( " -c : write to standard output (even if it is the console) \n"); DISPLAYOUT( " -c : write to standard output (even if it is the console), keep original file \n");
DISPLAYOUT( " -v : verbose mode; specify multiple times to increase verbosity \n"); DISPLAYOUT( " -v : verbose mode; specify multiple times to increase verbosity \n");
DISPLAYOUT( " -q : suppress warnings; specify twice to suppress errors too \n"); DISPLAYOUT( " -q : suppress warnings; specify twice to suppress errors too \n");
@ -925,7 +925,7 @@ int main(int argCount, const char* argv[])
if (!strcmp(argument, "--help")) { usage_advanced(programName); CLEAN_RETURN(0); } if (!strcmp(argument, "--help")) { usage_advanced(programName); CLEAN_RETURN(0); }
if (!strcmp(argument, "--verbose")) { g_displayLevel++; continue; } if (!strcmp(argument, "--verbose")) { g_displayLevel++; continue; }
if (!strcmp(argument, "--quiet")) { g_displayLevel--; continue; } if (!strcmp(argument, "--quiet")) { g_displayLevel--; continue; }
if (!strcmp(argument, "--stdout")) { forceStdout=1; outFileName=stdoutmark; g_displayLevel-=(g_displayLevel==2); continue; } if (!strcmp(argument, "--stdout")) { forceStdout=1; outFileName=stdoutmark; FIO_setRemoveSrcFile(prefs, 0); g_displayLevel-=(g_displayLevel==2); continue; }
if (!strcmp(argument, "--ultra")) { ultra=1; continue; } if (!strcmp(argument, "--ultra")) { ultra=1; continue; }
if (!strcmp(argument, "--check")) { FIO_setChecksumFlag(prefs, 2); continue; } if (!strcmp(argument, "--check")) { FIO_setChecksumFlag(prefs, 2); continue; }
if (!strcmp(argument, "--no-check")) { FIO_setChecksumFlag(prefs, 0); continue; } if (!strcmp(argument, "--no-check")) { FIO_setChecksumFlag(prefs, 0); continue; }
@ -1114,7 +1114,7 @@ int main(int argCount, const char* argv[])
operation=zom_decompress; argument++; break; operation=zom_decompress; argument++; break;
/* Force stdout, even if stdout==console */ /* Force stdout, even if stdout==console */
case 'c': forceStdout=1; outFileName=stdoutmark; argument++; break; case 'c': forceStdout=1; outFileName=stdoutmark; FIO_setRemoveSrcFile(prefs, 0); argument++; break;
/* do not store filename - gzip compatibility - nothing to do */ /* do not store filename - gzip compatibility - nothing to do */
case 'n': argument++; break; case 'n': argument++; break;
@ -1279,7 +1279,7 @@ int main(int argCount, const char* argv[])
} }
nbInputFileNames = filenames->tableSize; /* saving number of input files */ nbInputFileNames = filenames->tableSize; /* saving number of input files */
if (recursive) { /* at this stage, filenameTable is a list of paths, which can contain both files and directories */ if (recursive) { /* at this stage, filenameTable is a list of paths, which can contain both files and directories */
UTIL_expandFNT(&filenames, followLinks); UTIL_expandFNT(&filenames, followLinks);
} }
@ -1392,7 +1392,7 @@ int main(int argCount, const char* argv[])
} }
UTIL_refFilename(filenames, stdinmark); UTIL_refFilename(filenames, stdinmark);
} }
if (!strcmp(filenames->fileNames[0], stdinmark) && !outFileName) if (!strcmp(filenames->fileNames[0], stdinmark) && !outFileName)
outFileName = stdoutmark; /* when input is stdin, default output is stdout */ outFileName = stdoutmark; /* when input is stdin, default output is stdout */

View File

@ -24,6 +24,10 @@ zstd -c file | zstd -t
zstd --stdout file | zstd -t zstd --stdout file | zstd -t
println bob | zstd | zstd -t println bob | zstd | zstd -t
# Test keeping input file when compressing to stdout in gzip mode
$ZSTD_SYMLINK_DIR/gzip -c file | zstd -t ; test -f file
$ZSTD_SYMLINK_DIR/gzip --stdout file | zstd -t ; test -f file
# Test --rm # Test --rm
cp file file-rm cp file file-rm
zstd --rm file-rm; zstd -t file-rm.zst zstd --rm file-rm; zstd -t file-rm.zst