To remove the first character¹ of every non-empty regular file in or below the current working directory, in the zsh shell, you could do:
zmodload zsh/mapfile
for file (**/*(ND.L+0)) mapfile[$file]=${mapfile[$file]#?}
Note that it's not exactly the same as removing the first character of the first line in the special case where the first line is empty (the file starts with a newline character). In that case, the above removes that newline character which means the first (empty) line is removed. If you don't want that, you can replace ? (which matches any character) with [^$'\n'] which matches any character other than newline.
Note that as that ends up loading the whole file in memory, you wouldn't want to do that on very large files.
A more memory friendly approach but that still rewrites the original file in place and preserved all its metadata (as opposed to sed -i which replaces the file with a modified copy) could be:
find . -name '*.jpg' -size +0 -exec ksh93 -c '
builtin cat
for file do
{ IFS= read -rN1 && cat; } < "$file" 1<>; "$file"
done' ksh93 {} +
Where this time we use ksh93's <>; redirection operator that opens a file in read+write mode (initially without truncation) and truncates it only upon exit of the redirected command if that command was successful. Here, the command is a command group that reads one character from stdin and discards it, and then writes the rest of its stdin to stdout.
Beware that GNU find (contrary to zsh) won't find files with names ending in .jpg if the rest of the file name can be decoded as characters in the current locale.
¹ or first byte for those files that start with something that can't be decoded into characters in the locale's character encoding. Compare with sed '1s/.//' which would remove the first character that can be decoded as such, so not necessarily at the start of the file or sed '1s/^.//' which would remove the first character at the start of the first line if there is one there, but do nothing otherwise
tail -cdoes bytes which are not always the same as characters, since countries other than the US came into existence. Linux usually provides GNU sed which has-iinplace, so as long as the first character isn't a newline,sed -i 1s/^.// file...will work on one or more files, including multibyte chars if the locale is suitable, although as you note it does need to copy (the rest of) each file. (At least some BSD sed's also have-i, but POSIX doesn't.)rev input | cut -c2- | rev | cut -c2-Modified:rev * | cut -c2- | rev | cut -c2-rev * | cut -c2- | rev | cut -c2- | tee *I can't find the original versions for these:echo * | sed -r 's/^.{1}//'tail -c +2 'Text File.txt' > 'Text File.txt.new' && mv 'Text File.txt.new' 'Text File.txt'awk '{print substr($1,2) > "*" }' *