Is it possible to open a file from the terminal not by its name but by its (number) position in the folder? Or any other option?
Because the name is too long.
Is it possible to open a file from the terminal not by its name but by its (number) position in the folder? Or any other option?
Because the name is too long.
Just for fun, literally answering the question:
#!/usr/bin/env python3
import os
import subprocess
show_hidden = False
currfiles = os.listdir("./")
if not show_hidden:
currfiles = [f for f in currfiles if not f.startswith(".")]
n = 1
for f in currfiles:
print(str(n) + ". " + f)
n = n + 1
picked = int(input("Quick, quick, give me a number:\n"))
subprocess.run(["xdg-open", currfiles[picked - 1]])
The content of the current directory is listed, numbered. Pick the number and the item is opened:
...is easy:
Log out and back in and start using the command by just typing
$ o
in terminal
If you'd like to show hidden files as well, change
show_hidden = False
into:
show_hidden = True
There is a little-known feature in Bash that allows you to do this without calling on python or any other third-party tool, and with a single line:
select file in *; do open "$file"; break; done
In pure bash, using the select statement:
PS3='Quick, quick, give a number: '
select file in *
do
xdg-open "$file"
break
done
Setting PS3 is just eyecandy. If you leave it out, you will just get the default prompt. If you leave out the break statement, the select statement will loop until you hit CTRL-D or CTRL-C.
Of course you can also run it as a one-liner:
select file in *; do xdg-open "$file"; break; done
You can install and use mc, Midnight Commander. It is a text user interface with menus etc inspired by the old Norton Commander, that was popular when people used MSDOS (before Windows).
sudo apt update
sudo apt install mc
and start it in a terminal window or in a text screen,
mc
$ ls
results.log
string
Templates
textfile
time
time.save
vegetables
vegetablesbsh
How bout
ls | sed -n 3p
Prints 3rd file name
Templates
Open it-
xdg-open "$(ls | sed -n 3p)"
Usually works.
Put it in a script
#!/bin/bash
xdg-open "$(ls | sed -n "$1"p)"
Name of script: open
Save it in home folder. Run:
./open file_number
On Linux filesystems, filenames have a very interesting property called inode: a directory ( or folder ) is a listing of inodes and which filenames point to those inodes. So, if you know the inode number, you can attempt to locate the file using find utility and do certain operations on it. This is especially useful when dealing with filenames in different locale, special characters, or when you accidentally created directory called ~.
For example,
$ ls -i1
1103993 crs.py
1103743 foobar.txt
1147196 __pycache__
1103739 'with'$'\n''newline.png'
1103740 yellowstone.jpg
$ find . -type f -inum 1103743 -exec xdg-open {} \; -and -quit
What this does is traverse current working directory ( represented by . ) and look for directory entry that is a file with inode number 1103743. If the file is found, xdg-open will open the file with default application and find will quit afterwards. The reason for the extra -and and -quit is to prevent xdg-open reopening the file if there exist hard links to the file (which is equivalent to opening the same file twice).
Make some files:
$ for i in $(seq -w 0 20); do echo "This is file $i." > $i.txt; done
$ ls
00.txt 03.txt 06.txt 09.txt 12.txt 15.txt 18.txt
01.txt 04.txt 07.txt 10.txt 13.txt 16.txt 19.txt
02.txt 05.txt 08.txt 11.txt 14.txt 17.txt 20.txt
$ cat 16.txt
This is file 16.
Put the files into a variable and open the file by an index.
$ files=(*)
$ xdg-open "${files[12]}"
# Opens 12.txt in a text editor, which reads "This is file 12."
Replace 12 with the index you're trying to open.
This is probably the simplest answer that directly answers the question. try the following:
touch file-1 file-2 file-3
Let's say we want to open (or edit) the second file, we can do the following:
echo `ls` | cut -d' ' -f2
this will output the name of the second file, which we can use as input to the command we want to perform, for example:
cat $( echo `ls` | cut -d' ' -f2 )
will output the content of the second file.
note that you can change the order in which the files are printed by ls, by tweaking ls arguments, see
man lsfor details.
[UPDATE] this assumes that you have no white-spaces in file names,
thanks @wjandrea for your observation.