marcusbuffett / pipe-rename

Rename your files using your favorite text editor
https://crates.io/crates/pipe-rename
MIT License
397 stars 12 forks source link

Error: Nonexisting input files. Aborting. @FreeBSD #46

Open vermaden opened 2 years ago

vermaden commented 2 years ago

Hi,

not sure it is FreeBSD related but:

% find . | sort
.
./Velvet Acid Christ 'Fun With Knives' 01. Decypher.mp3
./Velvet Acid Christ 'Fun With Knives' 02. The Dark Inside Me.mp3
./Velvet Acid Christ 'Fun With Knives' 03. There Is No God.mp3
./Velvet Acid Christ 'Fun With Knives' 04. Icon.mp3
./Velvet Acid Christ 'Fun With Knives' 05. Fun With Drugs.mp3
./Velvet Acid Christ 'Fun With Knives' 06. Speedball O.D..mp3
./Velvet Acid Christ 'Fun With Knives' 07. Psycho.mp3
./Velvet Acid Christ 'Fun With Knives' 08. Slut.mp3
./Velvet Acid Christ 'Fun With Knives' 09. Apflux.mp3
./Velvet Acid Christ 'Fun With Knives' 10. Fun With Knives.mp3
./Velvet Acid Christ 'Fun With Knives' 11. Caught.mp3
./Velvet Acid Christ 'Fun With Knives' 12. Futile 98.mp3
./Velvet Acid Christ 'Fun With Knives' 13. The Dark Inside Her.mp3
./Velvet Acid Christ 'Fun With Knives' 14. Cyber Communists Plotting Red Revolt.mp3
./Velvet Acid Christ 'Fun With Knives' 15. Over.mp3

% ls -1 | env EDITOR=geany renamer

The following input files do not exist:
Velvet Acid Christ 'Fun With Knives' 01. Decypher.mp3
Velvet Acid Christ 'Fun With Knives' 02. The Dark Inside Me.mp3
Velvet Acid Christ 'Fun With Knives' 03. There Is No God.mp3
Velvet Acid Christ 'Fun With Knives' 04. Icon.mp3
Velvet Acid Christ 'Fun With Knives' 05. Fun With Drugs.mp3
Velvet Acid Christ 'Fun With Knives' 06. Speedball O.D..mp3
Velvet Acid Christ 'Fun With Knives' 07. Psycho.mp3
Velvet Acid Christ 'Fun With Knives' 08. Slut.mp3
Velvet Acid Christ 'Fun With Knives' 09. Apflux.mp3
Velvet Acid Christ 'Fun With Knives' 10. Fun With Knives.mp3
Velvet Acid Christ 'Fun With Knives' 11. Caught.mp3
Velvet Acid Christ 'Fun With Knives' 12. Futile 98.mp3
Velvet Acid Christ 'Fun With Knives' 13. The Dark Inside Her.mp3
Velvet Acid Christ 'Fun With Knives' 14. Cyber Communists Plotting Red Revolt.mp3
Velvet Acid Christ 'Fun With Knives' 15. Over.mp3

Error: Nonexisting input files. Aborting.

Regards.

vermaden commented 2 years ago

These files for sure. If I face other problematic files I will let you know.

assarbad commented 2 years ago

@vermaden this being FreeBSD and seeing the % prompt I'll guess Zsh. But could you fill in some blanks by executing the following from your shell:

$SHELL --version; env|grep -P '^(LC_|LANG|EDITOR)'

(grep -E should also do, but I don't know if this is supported by whatever grep comes out of the box in recent FreeBSDs)

Just thinking out loud: perhaps there is a misunderstanding between how ls/find output the name and how renamer sees them.

Also, could you try find -type f|sort|env EDITOR=geany renamer instead of the ls -1|...?

vermaden commented 2 years ago

Hi,

yes - its ZSH.

Here is the ouuput:

% $SHELL --version; env|grep -P '^(LC_|LANG|EDITOR)'
zsh 5.9 (amd64-portbld-freebsd13.1)
usage: grep [-abcDEFGHhIiLlmnOoPqRSsUVvwxz] [-A num] [-B num] [-C num]
        [-e pattern] [-f file] [--binary-files=value] [--color=when]
        [--context=num] [--directories=action] [--label] [--line-buffered]
        [--null] [pattern] [file ...]

% $SHELL --version; env|grep -P -E '^(LC_|LANG|EDITOR)'
zsh 5.9 (amd64-portbld-freebsd13.1)
usage: grep [-abcDEFGHhIiLlmnOoPqRSsUVvwxz] [-A num] [-B num] [-C num]
        [-e pattern] [-f file] [--binary-files=value] [--color=when]
        [--context=num] [--directories=action] [--label] [--line-buffered]
        [--null] [pattern] [file ...]

% $SHELL --version; env|grep -E '^(LC_|LANG|EDITOR)' 
zsh 5.9 (amd64-portbld-freebsd13.1)
LC_COLLATE=C
EDITOR=vi
LANG=C.UTF-8
LC_ALL=en_US.UTF-8

I believe the last one is the one you were looking for.

Also - I use the GNU ls(1) as default so I will also show you the FreeBSD ls(1) variant below.

% bls -1 | env EDITOR=geany renamer
Error: No replacements found

% ls -1 | env EDITOR=geany renamer 
The following input files do not exist:
asd1
asd2
asd3
asd4
asd5

Error: Nonexisting input files. Aborting.

% which ls   
ls: aliased to  gls -p --color=always --time-style=long-iso --group-directories-first --quoting-style=literal

% which bls               
bls: aliased to /bin/ls -p -G -D "%Y.%m.%d %H:%M"

Regards.

assarbad commented 2 years ago

@vermaden cool, that was useful! Could you try one more thing please:

command gls -1|env EDITOR=geany renamer

Feel free to also try it with the FreeBSD ls, e.g. like so:

command ls -1|env EDITOR=geany renamer

The command is a builtin of Zsh (but also Bash) which ensures that not the alias or builtin or function, but the external command is used.

The reason I ask is because you have aliased your ls to the underlying gls --color=always ... and that particular switch may be the cause for the issue. I cannot tell for certain, since I don't see your terminal, but chances are that somehow those escape sequences end up garbling the names as seen by renamer. Just a theory, though.

Since you use a UTF-8 based locale, it's not about encodings, which was another possible suspect here.

vermaden commented 2 years ago

Sure.

I also added some tests with other editors.

Using it with Geany does not work at all. FreeBSD's vi(1) also does not work but its probably vi(1) fault.

It does work with vim(1) but output in the terminal is at strange offset and you need to type reset to have working terminal after it.

Here are the outputs:

Files that I am testing on:

% ls -la
total 84K
drwxr-xr-x  2 vermaden vermaden   7 2022-10-12 09:35 ./
drwxr-xr-x 44 vermaden vermaden 277 2022-10-17 14:58 ../
-rw-r--r--  1 vermaden vermaden   0 2022-10-10 21:43 asd1
-rw-r--r--  1 vermaden vermaden   0 2022-10-10 21:43 asd2
-rw-r--r--  1 vermaden vermaden   0 2022-10-10 21:43 asd3
-rw-r--r--  1 vermaden vermaden   0 2022-10-10 21:43 asd4
-rw-r--r--  1 vermaden vermaden   0 2022-10-10 21:43 asd5

Geany: I renamed asd1 to asd1a but does not work.

% command gls -1|env EDITOR=geany renamer
Error: No replacements found

% command ls -1|env EDITOR=geany renamer 
Error: No replacements found

FreeBSD vi(1):

% command ls -1|env EDITOR=vi renamer   
ex/vi: Vi's standard input and output must be a terminal
Error: Editor terminated unexpectedly. Aborting.

%  command gls -1|env EDITOR=vi renamer
ex/vi: Vi's standard input and output must be a terminal
Error: Editor terminated unexpectedly. Aborting.

vim(1):

% command ls -1|env EDITOR=vim renamer  
Vim: Warning: Input is not from a terminal
(...)
"/tmp/.tmpZwhWL4" 5L, 26B written

The following replacements were found:

                                      asd1 -> asd1a

                                                   Execute these renames?:
> Yes
       No
           Edit
                 Reset

% command ls -1|env EDITOR=vim renamer         
Vim: Warning: Input is not from a terminal
(...)
"/tmp/.tmpzwYNO9" 5L, 25B written

The following replacements were found:

                                      asd1a -> asd1

                                                   Execute these renames?:
> Yes
       No
           Edit
                 Reset

Hope that helps.

Regards.

assarbad commented 2 years ago

Sorry, @vermaden ... lost sight of this. Apologies.

If Geany has any indication of the code page or encoding it "thinks" the edited file is, could you have a look at that and paste it here?! If it "thinks" it's something wacky instead of UTF-8, I could imagine that being the issue. Your shell/terminal are configured for a UTF-8 locale and theoretically Geany should honor that setting, too. But what do I know? 😉

The issue you see with Vim on the terminal seems related to #54, I would reckon. Presumably because you are piping the names into the command. As both vi and Vim point out your input isn't coming from a terminal as it expects. Probably Vim does the best to comply whereas vi gives up with an error?

Have you tried env EDITOR=vim renamer * instead from the same directory? It should do the correct thing and AFAIK the shell should also do the right thing for you when it comes to file names with embedded whitespace.

Edit: to ensure anyone can try to reproduce this, could you please try to take a recursive copy of the folder containing those files somewhere (probably something like cp -ar <source-folder> <target-folder>/), then use truncate - as truncate -s 0 <filename> - to set all the files to zero size (that's why you'll want a copy on which to do it) and then tar them up? NB: GitHub only allows tar files with the .tar.gz extension, not even .tgz works.

Anyway, this should enable anyone to pick up a FreeBSD and try to reproduce it, given the locale settings agree (I think some UTF-8 locale will be fine even).


And one more thing, if you were to use (GNU) find you could use something like find ${optional_dir_to_search} -type f -exec renamer {} + or the more portable find ${optional_dir_to_search} -type f -exec renamer {} \;. But for the piping scenario something making renamer usable with find ... -print0|xargs -0 ... could be even more desirable.

vermaden commented 2 years ago

Hi.

Do not be sorry mate. We all do that because of passion in the expense of our personal lifes and time.

That syntax - env EDITOR=vim renamer * - works well with both vi(1) and vim(1) editors. The Geany still does not work - but I just assume that it is Geany's fault.

Thank You for working solution.

Regards.

in0ni commented 2 years ago

Hello, I'm having a similar issue. In my case my shell is also zsh, and my editor is Kakoune:

Running ls | renamer

Running renamer *

Running echo -e "one.file\ntwo.file" | renamer (running touch one.file two.file beforehand)

I tried to follow this thread to determine what the issue could be, but nothing really stood out.

Also I found this here: https://xplr.dev/en/awesome-hacks (under batch rename)... Ideally I would like to use selections, but since this does not work, I just modified the code to always use renamer *

assarbad commented 2 years ago

@in0ni your third example suggests this can solely be attributed to how renamer treats stdin/stdout/stderr.

So it could be related to #54 ...

assarbad commented 1 year ago

One more remark, @in0ni ... you can use (this syntax is particular to GNU find):

find -type f -exec renamer {} +

... or:

find -type f -print|xargs renamer

However, I think the second one could cause the issue with the terminal getting messed up. I am still investigating what's going on with that.

in0ni commented 1 year ago

Hello @assarbad,

I appreciate you continuing to look into this. Seems like something is up with the way renamer is dealing with pipes (with the over a decade of *nix use I'm still not 100% proficient or knowledgeable with this).

I will mention that I find this tool to be very powerful combined with a modal editor like Kakoune. At times I have to rename many files with different patterns and this approach has been the quickest and most flexible. So thanks for this tool!

So far I have not had the need to pass a specific list since I can use the power of the editor to filter out what I need. So I'm using renamer * for all my cases and have stopped trying to get other syntax to work.

assarbad commented 1 year ago

Also on this ticket, in case someone is still reading.

Workaround (not a fix!) If you encounter the messed up terminal issue, for now you can use stty sane. After that everything should work as expected in the terminal again.

in0ni commented 1 year ago

Hey @assarbad , I have not gotten around to report this yet -- but now (for a few weeks) renamer does not work at all:

All return: Error: No replacements found

No version change in the tool, let me know if you need any assistance debugging

UPDATE: seems to be an issue on my end. My editor is "kak", but editor is set to "kcr edit", so using -e "kak" works 😅

assarbad commented 1 year ago

I suppose you have built it yourself? What tag/revision? I think there was no formal version change in the crate for some reason, I also noticed that :-|