# Ubuntu – Nautilus: Custom Action on selected files via keyboard short-cut

command linekeyboardnautilusshortcut-keys

1. I open a directory containing about 100 files in nautilus
2. I select N (maybe 10) files by looking at the preview of the file.
3. Now I would like to hit short-cut and my custom script should be called.
4. My custom script receives the file names and does what I want it to do.

How can I register a custom action in gnome/ubuntu/nautilus which receives the file names which are selected in nautilus?

# New context entry in context menu of nautilus

If you write a script in ~/.local/share/nautilus/scripts, then you get a new entry in the context menu. How to call this script via a short-cut?

# Background

This is a follow-up question to Nautilus: Mark files in directory as favorite

# Version

I use Ubuntu 16.04

## Running actions on selected files

how to call a script and use the currently selected files as arguments [1].

However, the accepted answer in the linked question uses nautilus scripts, which take files as arguments from nautilus. That does not work from a shortcut, only when right-clicked in nautilus. In [2], I therefore added the functionality of the scripts from the linked question to the answer, so you only need to run either one of them (in [2]) from a shortcut.

### [1] For 16.04 and higher*, running a script with selected files as arguments

You can simply use the short script below. It will "read" the currently selected files and run your script with the files as arguments.

#!/usr/bin/env python3
import subprocess
import pyperclip
import time

time.sleep(1)
subprocess.call(["xdotool", "key", "Control_L+c"])

for item in pyperclip.paste().splitlines():
subprocess.Popen(["/path/to/script", item])


### To use

1. install python3-pyperclip and xdotool:

sudo apt install python3-pyperclip xdotool

2. Copy the script above into an empty file, save it as run_withselected.py Replace in the script

"/path/to/script"


by the actual path to the script you want to run. Use absolute paths, in quotes.

3. Add it to a shortut key: Choose: System Settings > "Keyboard" > "Shortcuts" > "Custom Shortcuts". Click the "+" and add the command:

python3 /path/to/run_withselected.py


## [2] However

Note that the linked nautilus script from the other answer will not run like this however, since it retrieves its arguments in another way from nautilus directly. I therefore combined the functionality of the script from the linked question, with the one above.

You don't need the other script(s) from the other answer anymore then.

### A. Designate files by changing the name

select files

press shortcut to mark (toggle) the files

#!/usr/bin/env python3
import subprocess
import pyperclip
import shutil
import os
import time

time.sleep(1)

def npath(p, f):
return os.path.join(p, f)

subprocess.call(["xdotool", "key", "Control_L+c"])
for item in pyperclip.paste().splitlines():
data = item.rsplit("/", 1); path = data[0]; name = data[1]
newname = name[2:] if name.startswith("*0") else "*0"+name
shutil.move(npath(path, name), npath(path, newname))


### B. Designate files by creating a link in a "favorites" directory

select files

press shortcut to create (toggle) a link in "My_Favorites"

#!/usr/bin/env python3
import subprocess
import pyperclip
import shutil
import os
import time

fav = os.path.join(os.environ["HOME"], "My_Favorites")

try:
os.mkdir(fav)
except FileExistsError:
pass

time.sleep(1)

subprocess.call(["xdotool", "key", "Control_L+c"])
for item in pyperclip.paste().splitlines():
name = item.rsplit("/", 1)[-1]
try:
except FileExistsError:


### To use (either one)

1. the scripts needs python3-pyperclip and xdotool:

sudo apt install python3-pyperclip xdotool

2. Copy the script above into an empty file, save it as toggle_selected.py

3. Add shortut key: Choose: System Settings > "Keyboard" > "Shortcuts" > "Custom Shortcuts". Click the "+" and add the command:

python3 /path/to/toggle_selected.py


### Explanation

1. The script uses xdotool to virtually press Ctrl+C
2. Subsequently, the script (internally) creates a list of selected files:

pyperclip.paste().splitlines()

3. These files are subsequently used as arguments to either rename the files:

for item in pyperclip.paste().splitlines():
data = item.rsplit("/", 1); path = data[0]; name = data[1]
newname = name[2:] if name.startswith("*0") else "*0"+name
shutil.move(npath(path, name), npath(path, newname))


for item in pyperclip.paste().splitlines():
name = item.rsplit("/", 1)[-1]
try:
except FileExistsError:

4. The time.sleep(1) finally is to make sure "real" key press does not interfere with the simulated keypress by xdotool.

### Notes

sudo apt-get install python3-pip xdotool