interdimensionalmeme@lemmy.ml to Linux@lemmy.ml · 15 days agozcat shouldn't error out if you try to zcat an uncompressed file, it should just output the damned file !message-squaremessage-square32fedilinkarrow-up181arrow-down111file-text
arrow-up170arrow-down1message-squarezcat shouldn't error out if you try to zcat an uncompressed file, it should just output the damned file !interdimensionalmeme@lemmy.ml to Linux@lemmy.ml · 15 days agomessage-square32fedilinkfile-text
minus-squareallywilson@lemmy.mllinkfedilinkarrow-up4·15 days agoWon’t this cause cat to iterate through all files in the cwd once zcat encounters an issue, instead of just the specific file?
minus-squareMonkderVierte@lemmy.mllinkfedilinkarrow-up1·15 days agoYeah, i was tired and had $file there first, then saw that you wanted to cat all in directory. Still tired, but i think this works now.
minus-squareLemoineFairclough@sh.itjust.workslinkfedilinkEnglisharrow-up1·edit-215 days agoYou are correct. This probably produces something more similar to what you’d want the original command to do, but with better safely: find -- . -type f -regex '^\./[^/]*$' -exec sh -c -- 'for file in "${@}"; do zcat "${file}" || cat "${file}" || exit; done' sh '{}' '+' That assumes you want to interact with files with names like .hidden.txt.gz though. If you don’t, and only intend to have a directory with regular files (as opposed to directories or symbolic links or other types of file), using this is much simpler and even safer, and avoids using files in a surprising order: for i in *; do zcat -- "$i" || cat -- "$i" || exit; done Of course, the real solution is to avoid using the Shell Command Language at all, and to carefully adapt any program to your particular problem as needed: https://sipb.mit.edu/doc/safe-shell/
Won’t this cause cat to iterate through all files in the cwd once zcat encounters an issue, instead of just the specific file?
Yeah, i was tired and had $file there first, then saw that you wanted to cat all in directory. Still tired, but i think this works now.
You are correct. This probably produces something more similar to what you’d want the original command to do, but with better safely:
find -- . -type f -regex '^\./[^/]*$' -exec sh -c -- 'for file in "${@}"; do zcat "${file}" || cat "${file}" || exit; done' sh '{}' '+'
That assumes you want to interact with files with names like
.hidden.txt.gz
though. If you don’t, and only intend to have a directory with regular files (as opposed to directories or symbolic links or other types of file), using this is much simpler and even safer, and avoids using files in a surprising order:for i in *; do zcat -- "$i" || cat -- "$i" || exit; done
Of course, the real solution is to avoid using the Shell Command Language at all, and to carefully adapt any program to your particular problem as needed: https://sipb.mit.edu/doc/safe-shell/