I was reading through the cli reference here and I noticed the statement about ipfs file ls
being deprecated:
This functionality is deprecated, and will be removed in future versions. If
possible, please use ‘ipfs ls’ instead
But from reading about Mutable File System (MFS) here it is stated that:
MFS is accessed through the files
commands in the IPFS CLI and API
If listing via ls
is part of the functionality of MFS, won’t it be consistent to keep it as subcommand of ipfs file
?
The commands are different:
ipfs file ls
(and ipfs ls
) works on IPFS paths - e.g /ipfs/Qmfoo
or /ipfs/Qmfoo/some/dir
ipfs files ls
works on MFS paths e.g. /path/in/my/mfs
The confusion is part of why it’s deprecated.
Thanks for the response. But a little more clarification would be needed as I find what you said a bit confusing still. I illustrate:
The above statement appears contradictory…unless you mean to say that:
ipfs files ls
works both on IPFS paths
and MFS paths
while ipfs ls
works only on IPFS paths
.
Or maybe there is an unintended typo in there that leads to the apparent contradiction?
Also while we are at it, this is the first time I see a clear distinction been made between IPFS path
and MFS path
. Want to shed more light on that? Or point to resources that does? Saving me a couple of googling time 
oh my! The plot thickens. Just seeing there is: ipfs ls
, ipfs files ls
, and ipfs file ls
…not sure yet why there is ipfs file
and ipfs files
…
ipfs file ls
is the same as ipfs ls
.
ipfs ls
works on IPFS paths.
An IPFS path is a CID that resolves to a DAG that represents a directory (e.g. /ipfs/Qmfoo
) or a subdirectory (e.g. /ipfs/Qmfoo/subdir
)
IPFS paths are not MFS paths.
MFS paths are used by the ipfs files ...
commands and look like traditional Unix paths but apply to a DAG in your repo.
Please see the IPFS primer for more information: https://dweb-primer.ipfs.io and the docs https://docs-beta.ipfs.io
Not sure about this though. Here are some output from my terminal that shows they are not 100% same
$ ./ipfs ls QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB
while
$ ./ipfs file ls QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB
QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB
With a data that is way larger than 256K
$ ./ipfs ls QmPZYifeFZFbPFTSt1iDg6TM9vXEPUSYTwtC7jMPnrdz53
QmViHZnWRf45Lhnd8JHwtp7bZRtt3ePWcVa4vK7jyL7jeq 262144
QmfAgqGwwKSNVusRbNMnStc9Te68M9zi9pKXCbNQT8p69s 262144
Qmd5Y6WgLHwLddck34NXwMUkFQkPg9A6Re7RYmMF3cCrU5 262144
Qmc6FWE6bagz2rC5QX8A2CKDpKwiUQshSf5rdVEQpRebKR 262144
...
...
...
while
$ ./ipfs file ls QmPZYifeFZFbPFTSt1iDg6TM9vXEPUSYTwtC7jMPnrdz53
QmPZYifeFZFbPFTSt1iDg6TM9vXEPUSYTwtC7jMPnrdz53
These two commands show different behaviour.
Heh, well, the intention behind the commands is the same, but the implementation differs:
$ ipfs ls --help
USAGE
ipfs ls <ipfs-path>... - List directory contents for Unix filesystem objects.
$ ipfs file ls --help
USAGE
ipfs file ls <ipfs-path>... - List directory contents for Unix filesystem objects.
Yeah, which is why it all feels confusing. I read the cli help text, execute the commands and I see different things…For example more outputs showing their differences:
./ipfs file ls QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/
about
contact
help
ping
quick-start
readme
security-notes
while
./ipfs ls QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/
QmQy6xmJhrcC5QLboAcGFcAE1tC8CrwDVkrHdEYJkLscrQ 1681 about
QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact
QmU5k7ter3RdjZXu3sHghsga1UQtrztnQxmTL22nPnsu3g 311 help
QmejvEPop4D7YUadeGqYWmZxHhLc4JBUCzJJHWMzdcMe2y 4 ping
QmQGiYLVAdSHJQKYFRTJZMG4BXBHqKperaZtyKGmCRLmsF 1681 quick-start
QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme
QmQ5vhrL7uv6tuoN9KeVBwd4PwfQkXdVVmDLUZuTNxqgvm 1162 security-notes
/ipfs file ls
seems to drop some of the ipfs specific info, but ipfs ls
does not.
Talking about intentions, this is the conclusion I am reaching after poking around a bit more and reading more cli help text:
Apparently mfs
is 100% distinct and separate thing and it differs from the other file operations I have been seeing and running. These portion from the help text of ipfs files
made it clear:
Content added with “ipfs add” (which by default also becomes pinned), is not
added to MFS. Any content can be put into MFS with the command “ipfs files cp
/ipfs/ /some/path/”
So ipfs ls
and ipfs file ls
are supposed to be the same (although they show slightly different behaviour in reality). While ipfs files
commands deal in the realm of MFS
.
This is also basically what you explained here
I think it is less confusing now. Thanks @achingbrain.
Now with this clarification, I can see how the title I used for this thread is wrong:
Why is ipfs files ls being deprecated?
It is not ipfs file*s* ls
that is being deprecated (which exist within MFS), but ipfs file ls
that is being deprecated since it should be more or less the same as ipfs ls
- even though in reality both commands show slightly different behaviours.