I want to zip individual files gotten from an output & delete the original files. The objective is to find files greater than 9MB and zip each file of that size individually & remove its original instance. Something like this..
find test* -type f - size 9M
zip -m <filenames (from the above output)> <individual filename.zip>
expected output -
test_abc1.txt.1.zip
test_abc2.txt.2.zip
test_abc3.txt.zip
CodePudding user response:
For zipping individual files with find
, the main problem is how to generate the zip filenames automatically; for that you can use shell parameter expansions in a find -exec
inline script:
find test* -type f -size 9M -exec sh -c '
for f
do
z=${f##*/}.zip
zip -j -m "$z" "$f"
done
' _ {}
notes:
The
z=${f##*/}.zip
strips the directory path component of$f
and append a.zip
at the end; for example, if$f
istest1/file.txt
, then$z
will befile.txt.zip
.
If you also want to replace the file extension by.zip
then you can usez=${f##*/} z=${z%.*}.zip
instead.The
-j
option ofzip
is for stripping the directory path inside the ZIP archive.The
-m
option ofzip
is for removing the input file(s) after successful generation of the ZIP archive.